3.4 printf格式输出函数
3.4.1 printf格式输出函数的基本格式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,但作为一个特例,在有些环境下,不要求在使用printf函数之前必须包含stdio.h文件。printf函数调用的一般形式如下。
printf("格式字符串" [,输出项表]);
1.函数的作用
将一个或多个常量、变量或表达式的值,按可选择的格式转化为字符串,嵌入指定位置的字符串中输出。
2.格式字符串
“格式字符串”也称“转换控制字符串”,可以包含三种字符:格式控制说明、转义字符、普通字符。
(1)格式控制说明
以%开头,在%后面跟有各种宽度和格式控制符,用于控制将常量、变量或表达式的值转化为字符串的格式,其一般形式如下。
% [宽度控制符] 格式控制符
(2)转义字符
如'\n'就是转义字符,输出时产生一个“换行”操作。还有其他一些用于控制的转义字符,如'\t'、'\r'、'\b'等。
(3)普通字符
除格式指示符和转义字符之外的其他字符,普通字符原样输出,在显示中起提示作用。
3.输出项表
输出项表内容可为常量、变量或表达式,输出项表是可选的。若输出的数据不止1个,相邻两个之间用逗号分开。注意:要求格式指示符和各输出项在数量和类型上应该一一对应,否则会出现错误或死循环。
例3-3中的printf()函数都是合法的。
【例3-3】
main() { float a=1.2345; int b=100; printf("I am a student.\n"); // 普通字符和转义字符 printf("%bd\n",3+2); // 表达式 printf("a=%f*****b+3=%5d\n",a,b+3); // 表达式 printf("%05bd,%c\n",56,56); // 常量 }
程序运行结果如图3-3所示。
图3-3 程序运行结果
3.4.2 printf格式控制符
格式控制符用于控制将常量、变量或表达式等以二进制形式保存的数值转换为可理解的多个字符,其格式和意义见表3-1。
表3-1 格式控制符的意义
格式控制符必须按从左到右的顺序,与输出项表中的每个数据的类型一一对应,否则就会出错,例如下面语句存在错误。
printf("str=%s,f=%d,i=%f\n", "Internet", 1.0 / 2.0, 3 + 5, "CHINA");
格式控制符x、e、g可以用小写或大写字母。使用大写字母时,输出数据中包含的字母也大写。其他格式字符必须用小写字母,如“%f”不能写成“%F”。
格式控制符紧跟在“%”后面就作为格式控制符,否则将作为普通字符使用原样输出。例如:“printf("c=%c, f=%f\n",c,f);”中的第一个“c”和“f”,都是普通字符。
3.4.3 printf宽度格式符
在%和格式控制符之间可以有宽度控制符,用于控制输出时的对齐方向、宽度、小数部分的位数等要求,可作为宽度控制的字符见表3-2,宽度控制符可以是其中一个或多个的组合。
表3-2 宽度控制符的意义
3.4.4 printf函数使用实例
1.%d以带符号的十进制整数形式输出
【例3-4】
main() { int n1=123; long int n2=123456; printf("%d,%5d,%-5d,%2d\n",n1,n1,n1,n1); printf("%ld,%8ld,%5ld\n",n2,n2,n2); printf("n1=%ld\n",n1); }
程序运行结果如图3-4所示。
图3-4 程序运行结果
2.%o,%x,%u形式输出整数
所谓无符号形式是指:不论正数还是负数,系统一律当做无符号整数来输出。
【例3-5】
main() { int aa=-5;unsigned bb=65500; printf("d=%d, o=%o, x=%x, u=%u, ",aa,aa,aa,aa); printf("d=%d, o=%o, x=%x, u=%u",bb,bb,bb,bb); }
程序运行结果如图3-5所示。
图3-5 程序运行结果
3.%f,%e,%E形式输出浮点数
%f以小数形式、按系统默认的宽度和精度输出浮点数;%e/%E以标准指数形式输出,尾数中的整数部分大于等于1、小于10,尾数中的小数部分占6位;%g让系统根据数值的大小,自动选择%f或%e格式,且不输出无意义的零。
【例3-6】
main( ) { float f=123.456789; double d1, d2; d1=1111111111111.111111111; d2=2222222222222.222222222; printf("%f, %12f, %12.2f\n",f,f,f); printf("%-12.2f, %.2f\n",f,f); printf("d1+d2=%f\n",d1+d2); printf("%e, %12e, %12.2e\n",f,f,f); printf("%-12.2e, %.2e\n",f,f); printf("d1+d2=%e\n",d1+d2); printf("%g,%12g, %12.2g\n",f,f,f); printf("%-12.2g, %.2g\n",f,f); printf("d1+d2=%g\n",d1+d2); }
程序运行结果如图3-6所示。
图3-6 程序运行结果
C51不支持double和long double类型数据,只有7位有效数字,多余部分四舍五余,本程序的输出结果中,超出了有效数字的范围。
4.%c输出一个字符
%c输出只占一列宽度。
【例3-7】
main() { char c='A'; int i=1386; printf("c=%c, %5c, %bd, %d\n",c,c,c,c); printf("i=%d, %04x, %c\n",i,i,(char)i); }
程序运行结果如图3-7所示。
图3-7 程序运行结果
输出16640是因为类型错误,当int整数以字符形式输出时,应转换成char型数据。
5.%s输出一个字符串
%ms表示按m宽度输出字符串,若串长>m,则按照字符串原样输出;若串长<m,则左边补空格。%-ms类似%ms,若串长<m,右边补空格。%m.ns表示靠右输出字符串左边的n个字符,左补空格。%-m.ns表示靠左输出字符串左边的n个字符,右补空格。注意:系统输出字符和字符串时,不输出单引号和双引号。
【例3-8】
main() { printf("%s,%5s,","Internet","Internet"); printf("%-10s,\n","Internet"); printf("%10.5s,","Internet"); printf("%-10.5s,","Internet"); printf("%4.5s,\n","Internet"); }
程序运行结果如图3-8所示。
图3-8 程序运行结果