本篇将重点介绍C语言的格式化输出函数 printf。当然该函数在C++程序中也可以使用。
目录
printf 函数构成及标准函数语句
格式字符种类的介绍
printf 函数的具体细节实现
格式符数量与输出表列不匹配
printf 返回值问题
格式控制符 / 附加格式控制符 的位置
其他需要注意的细节
printf 函数构成及标准函数语句
printf ( 格式控制,输出表列 )
这里格式控制指又包含了格式说明和普通字符。格式说明多用于变量,以 %+格式字符 的形式,表示按照格式输出;普通字符就按照原样输出即可。
这里要注意的是,转义符在格式控制中作为普通字符,输出的是转义符转义后的字符。(如 \x21 输出的就是感叹号 !,\n 输出的就是换行)
输出表列指真正输出的数据,这个数据可以是变量、常量,也可以是表达式或是函数等。
举个栗子:
int a=10;printf("%dxX\n",a);
这段代码中 "%dxX\n" 就是格式控制,其中%d是一个格式说明,说明了这里要输出的一个数据的格式是十进制整数(格式字符 d 表示带符号的十进制整数,有关内容后面会重点说明),而后面的xX是两个普通字符,\n 属于普通字符表示换行。输出表列中的 a 与格式控制中的 %d 对应,所以在 %d 位置的实际输出就是这个 a 表示的数字10
最终输出为:
10xX
(还有一个空行)
格式字符种类的介绍
格式字符分为两种基本格式字符和附加格式字符。基本格式字符如下表:
可以用以下代码加以验证:
int m = 10;printf("%d %o %x %u\n", m, m, m, m); //输出:10 12 a 10double b = 3.1415;printf("%f %e %g\n", b, b,b);//输出:3.141500 3.141500e+00 3.1415char s[] = "abcd";char c = '*';printf("%s %c\n", s, c);//输出:abcd *
除此以外,printf 函数还具有一些附加格式字符,具体如下表:
我们可以对上一段代码加以修饰,查看结果:
int a = 10;printf("%d %-5o %x %u\n", a, a, a, a);//输出:10 12 a 10double b = 3.1415;printf("%.2f %.3e %g\n", b, b,b);//输出:3.14 3.142e+00 3.1415char s[] = "abcd";char c = '*';printf("%.2s %c\n", s, c);//输出:ab *
printf 函数的具体细节实现
接下来将介绍这个函数使用的具体细节和主要注意点。
格式符数量与输出表列不匹配
在上面的讨论中我们总是保持格式符数量和输出表列保持一致,使输出正确。但是如果两者数量不匹配,会产生什么结果?我们要分两种情况讨论。
首先是格式符数量小于输出表列数量:
int a=10,b=20;printf("%d",a,b); //格式控制%d只有一个,而输出表列却有两个a、b/* 输出只有一个数字,且为前一个:10 */
其次是格式符数量大于输出表列数量:
int a=10,b=20;printf("%d %d %d",a,b); //格式控制%d有三个,而输出表列却只有两个a、b/* 正确输出a、b的值,多出一个输入为不可信的随机值 */
所以规律可以总结为下表:
printf 返回值问题
printf 作为一个函数也有返回值,它的返回值为实际输出的字符总数量(包括换行和空格等)。这里需要注意的是,在输出表列中的一个数输出可能有很多位,比如仅仅需要输出一个 int 型变量a,a的值为1000,但是返回值为4,因为1000虽然是一个数但是有4位。具体实例代码如下:
int a=1000;int ret=printf("%d \n",a); //输出 1000(空格+换行)printf("%d",ret);/* 输出6(4位数字+1空格+1换行) */
再提醒一下,最容易忽视的两点是:①一个数字可能会有多位,不要当作1计算 ②换行也算一个输出字符,不要遗漏。
格式控制符 / 附加格式控制符 的位置
在 printf 函数中,对格式控制符和附加格式控制符的位置顺序有以下规定:%后依次为附加格式控制符和格式控制符。也就是说附加格式控制符在基本格式控制符之前。
如:
%hi:短整型十进制有符号整数
%lX:长整型十六进制无符号整数
......
还有一点需要注意的是,输出时如果输出的数据类型与格式控制符的类型不一致,则以格式控制符为准(相当于会做一个类似于强制类型转换的操作)。
其他需要注意的细节
当设置了输出宽度时,若数字为负数,则负号也占据一位。%g和%G都是选择小数和科学计数法中较短的一种情况输出,且只输出六位有效数字。若输出的是指数形式(科学计数法),%g输出小写e,而%G输出大写E。当数据有效位数超过精度时,超出部分用不可信的随机值补足位数。如果指定的总宽度小于有效位数的宽度,输出有效位数宽度(即有效位数全部输出不截断),超过部分用不可信的随机值补足。以上就是C方式格式化输出的所有内容。后续会跟进一篇C语言格式化输入相关文章。