欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

字符串和格式化输入输出

程序员文章站 2022-04-10 20:13:12
讲解printf()函数,scanf()函数,详细说明格式字符串以及修饰符 ......

一;字符串简介

  字符串(character string)是一个或多个字符的序列。比如:“i am a teacher!” 注意:双引号不是字符串的一部分,它的作用是告知编译器它包含起来的内容是字符串。对比单引号用于标识单个字符。

二;char类型数组和null字符

  c语言当中,没有专门存储字符串的变量类型,字符串都被存储在char类型的数组当中(数组由联系的存储单元组成,同类型数据元素的有序序列)且使用空字符“\0”来标识字符串的结束。详细如下图:

字符串和格式化输入输出

注意:字符串和字符是不同的。比如:字符串常量“a”和字符常量‘a’它们的区别在于‘a’是基本类型(char),"a"是派生类型(char 数组)。另外区别“a”实际上是由两个字符组成的:‘a’+控制符。

三;常量和c预处理量

  3.1;符号常量(明示常量)是在编译程序时,程序中所有的符号常量被替换为定义的初始值,且不会被程序无意间改变值。同时也是方便日后程序的修改。(预编译器可以使用#include包含其他文件的信息同时也可以用来定义常量)

  3.2;定义符号常量格式:#define name value (详细参考下面例子)

#include <stdio.h>
#define pi 3.14159     //定义一个pi字符常量
int main(void)
{
    float area, circum, radius;

    printf("what is the redius of your pizza?\n")
    scanf("%f",&radius);
    area = pi * radius * radius;   //使用字符常量,编译过程中自动转换为数值3.14159
    circum = 2.0 * pi * radius;
    printf("your basic pizza parameters are as follows:\n");
    printf("circumference = %1.2f, area = %1.2f\n",circum,area);

    return 0;
}

四;connst限定符

  const关键字是c90标准新增的,作用是限定一个变量为只读。举例:

const int a = 12;      //a变量在程序中不可更改为只读。具体以后详细讲解:

五;明示常量

  明示常量相当于符号常量。常见使用如下:

  头文件limits.h包含明示常量如下:

明示常量 含义
char_bit char类型的位数
char_max char类型的最大值
char_min char类型的最小值
schar_max signned char 类型的最大值
schar_min signned char 类型的最小值
uchar_max unsigned char 类型的最大值
shrt_max short类型的最大值
shrt_minn short类型的最小值
ushrt_max unsigned char 类型的最大值
int_max

int类型的最大值

int_min int类型的最小值
uint_max unsigned int 的最大值
long_max long类型的最大值
long_min long类型的最小值
ulong_max unsigned long 类型的最大值
llong_max long long 类型的最大值
llong_min long long 类型的最小值
ullong_max unsigned long log 类型的最大值

  头文件float.h包含明示常量如下:

明示常量 含义
flt_mant_dig float类型的尾数位置
flt_dig float类型的最少有效数字位数(十进制)
flt_min_10_exp 带全部有效数字的float类型的最小负指数(以10为底)
flt_max_10_exp float类型的最大正指数(以10为底)
flt_min 保留全部精度的float类型最小正数
flt_max float类型的最大正数
flt_epsilon 1.00和比1.00大的最小float类型值之间的差值

 

六;printf()函数

  6.1;printf()函数为输出函数,且和scanf()函数一起称之为输入/输出函数。

  printf()函数格式为:printf(格式字符串,待打印项目1,待打印项目2,。。。) 其中“格式字符串”是双引号括起来的内容,使用“转换说明”符号来指定“待打印项目”值代入的位置以及数据转换可显示的形式。“待打印项目”可以是常量,变量,表达式。举例:

#include <stdio.h>
#define pi 3.14159
int main(void)
{
    int number = 7;
    printf("the number is %d\n",number);   //%d占位符,转换说明:有符号的十进制整数

    return 0;
}

注意:格式字符串中的转换说明一定要与后面的每个项目匹配。

  6.2;转换说明把以二进制格式存储在计算机中的值转换成一系列字符(字符串)以便于显示。printf()函数常见转换说明符号如下图:

转换说明 输出
%a 浮点数,十六进制数和p计数法(c99/c11)
%a 浮点数,十六进制数和p计数法(c99/c11)
%c 单个字符
%d 有符号十进制整数
%e 浮点数,e计数法
%e 浮点数,e计数法
%f 浮点是,十进制计数法
%g 根据值的不同,自动选择%f,%e,%e格式用于指数小于-4或者大于或等于精度时
%g 根据值的不同,自动选择%f,%e,%e格式用于指数小于-4或者大于或等于精度时
%i 有符号实际值整数
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 无符号十进制整数,使用十六进制数0f
%x 无符号十进制整数,使用十六进制数0f
%% 打印一个百分号

  6.3;printf()转换说明修饰符

    在%和转换字符之间插入修饰符可修饰基本的转换说明,比如:%4d 表示十进制整数位,保留4个最小字段宽度。如下表显示基本使用修饰符:

修饰符 含义
标记 标记包含5种类,详细查看下文标记表格。举例:“%-10d”
数字

最小字段宽度

注意:如果该字段不能容纳带打印的数字或字符串,系统默认会使用更宽的字段。

举例:“%4d”

.数字

精度

对于%e,%e,%f,转换,表示小数点右边数字的位数

对于%g,%g 表示有效数字最大的位数

%s 表示待打印字符的最大数量

整型转换,表示待打印数字的最小位数

举例:“%5.2f”打印一个浮点数,字段宽度5字符,其中小数点后面两位数字

h

和整数转换说明一起使用,表示short int 或unnsigned short int 类型的值

举例:“%hu”

hh

和整数转换说明一起使用,表示signed char 或者 unsigned char 类型的值

举例:“%hhu”

j

和整型转换说明一起使用,表示inntmax_t或uintmax_t类型的值、

举例:“%jd”

l

和整型转换说明一起使用,表示long int 或 unsigned long int 类型的值

举例:“%ld”

ll

和整型转换说明一起使用,表示long long int 或 unsigned long long int 类型的值

举例:“%lld”,"%8lld"

l

和浮点转换说明一起使用,表示long double 类型的值

举例:“%ld”,"%10.4le"

t

和整型转换说明一起使用,表示ptrdiff_t类型的值。ptrdiff_t是两个指针差值的类型

举例:“%td”,"%19.3ti"

z

和整型转换说明一起使用,表示size_t 类型的值。size_t是sizeof返回的类型

举例:“%zd”,"%12zd"

    printf()中的标记,详细查看如下表格:

标记 含义
-

待打印项左对齐。即,从字段的左侧开始打印该项

举例:“%-20s”

+

有符号值为正,则在值前面显示加号;为负,则在前面显示减号

举例:“%+6.3f”

空格

有符号值为正,则在值前面显示前导空格(不显示任何符号);为负。则在值前面显示减号

+标记覆盖一个空格

举例:“%6.3f”

#

把结果转换为另一种形式,如果是%o格式,则以0开始;如果是%x 或%x格式,则以0x 或0x开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点符号。对于%g和%g格式,#防止结果后面的0被删除。

举例:“%#o”

0 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记

    使用修饰符和标记的实例:

  示例一;字段宽度在打印整数时效果。

#include <stdio.h>
#define pages 959
int main(void)
{
        printf("*%d*\n",pages);
        printf("*%2d*\n",pages); //字段宽度为3位数字,规定输出2个字段宽度。所以默认自动扩大以符合整数成都
        printf("*%10d*\n",pages);
        printf("*%-10d*\n",pages);

        return 0;
}

  运行结果如图:

字符串和格式化输入输出

  示例二;浮点型修饰符组合

  。。。。。。

   7.4;printf()的返回值

    printf()返回值时返回打印字符的个数。

七;scanf()函数

  scanf()函数用来输入数据,因为键盘输入都是文本(字母,数字,标点符号)。比如我要输入整数2019,就要输入字符2,0,1,9 。但是计算机存储的是数值而不是字符串,所以需要通过scanf()函数将字符依次转换成数值。而printf()函数行为相反。

  scanf()函数使用格式:scanf(“格式字符串”,指向变量指针)

  格式字符串:用来表明字符输入流的目标数据类型

  指向变量指针:1;如果读取基本变量类型的值,则变量名称前加一个&。2;如果是字符串读入字符数组,不要使用&

使用举例:

#include <stdio.h>
int main(void)
{
        int age;
        float assets;
        char pet[30];

        printf("enter your age, assets, and favorite pet.\n");
        scanf("%d %f",&age,&assets);
        scanf("%s",pet);
        printf("%d $%.2f %s\n",age,assets,pet);
        return 0;
}

演示结果:

字符串和格式化输入输出

  7.1;scanf()函数转换说明如下表:

转换说明 含义
%c 把输入解释成字符,包括空白
%d 把输入解释成有符号十进制整数
%e,%f,%g,%a 把输入解释成浮点数
%e,%f,%g,%a 把输入解释成浮点数
%i 把输入解释成有符号十进制整数
%o 把输入解释成有符号八进制整数
%p 把输入解释成指针(地址)
%s 把输入解释成字符串。从第一个非空白字符开始,到下个空白字符之前的所有字符都是输入
%u 把输入解释成无符号十进制整数
%x,%x 把输入解释成有符号十六进制整数

  7.2;scanf()转换说明中的修饰符如下表:

转换说明 含义
* 抑制赋值,详细查看下文“printf()和scanf()的*修饰符”
数字

最大字段宽度。输入达到最大字段宽度处,或者第一次遇到空白字符停止

举例:“%10s”

hh

把整数作为signed char 或unsigned char 类型读取

举例:“%hhd”

ll

把整数作为long long 或 unsigned long long 类型读取

举例:“%lld”

j

在整型转换说明后面时,表明使用intmax_t 或uintmax_t类型

举例:“%jd”

z

在整型转换说明后面时,表明使用sizeof的返回类型

t 在整型转换说明后面时,表明使用表示两个指针差值的类型
h,l,l  

八;printf()和scanf()的*修饰符

  如果我们不希望预先定义字段宽度,希望通过程序来指定。那么我们可以使用*来代替字段宽度,但是还是需要使用一个参数来告诉函数具体的字段宽度是多少。举例如下:

#include <stdio.h>
int main(void)
{
    unsigned width, precision;
    int number = 256;
    double weight = 242.5;

    printf("enter a field width:\n");
    scanf("%d",&width)
    printf("the number is :%*d:\n",width,number);
    printf("now enter a width and a precision:\n");
    scanf("%d %d",&width,&precision);
    printf("weight = %*.*f\n",width,precision,weight); //"%*.*f"中两个*分别被width,precision参数代替
    printf("done!\n");

    return 0;
}