C 语⾔格式输出函数printf ()详解printf 函数称为格式输出函数,其关键字最末⼀个字母f 即为“格式”(format)之意。 其功能是按⽤户指定的格式,把指定的数据显⽰到显⽰器屏幕上。在前⾯的例题中我们已多次使⽤过这个函数。
printf 函数调⽤的⼀般形式
printf 函数是⼀个标准库函数,它的函数原型在头⽂件“stdio.h”中。 但作为⼀个特例,不要求在使⽤ printf 函数之前必须包含stdio.h ⽂件。 printf 函数调⽤的⼀般形式为: printf(“格式控制字符串”, 输出表列)
其中格式控制字符串⽤于指定输出格式。格式控制串可由格式字符串和⾮格式字符串两种组成。格式字符串是以%开头的字符串,在
%后⾯跟有各种格式字符,以说明输出数据的类型、形式、长度、⼩数位数等。如:
⾮格式字符串原样输出,在显⽰中起提⽰作⽤。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该⼀⼀对应。
【例4-3】printf 函数举例本例中四次输出了a 、b 的值,但由于格式控制串不同,输出的结果也不相同。第3⾏的输出语句格式控制串中,两格式串%d 之间加了⼀个空格(⾮格式字符),所以输出的a 、b 值之间有⼀个空格。第4⾏的printf 语句格式控制串中加⼊的是⾮格式字符逗号,因此输出的a 、b 值之间加了⼀个逗号。第5⾏的格式串要求按字符型输出a 、b 值。第6⾏中为了提⽰输出结果⼜增加了⾮格式字符串。
格式字符串
在Turbo C 中格式字符串的⼀般形式为:
[标志][输出最⼩宽度][.精度][长度]类型。
其中⽅括号[]中的项为可选项。
各项的意义介绍如下。
1) 类型
类型字符⽤以表⽰输出数据的类型,其格式符和意义如下表所⽰:
格式字符
意义d
以⼗进制形式输出带符号整数(正数不输出符号)o
以⼋进制形式输出⽆符号整数(不输出前缀0)x,X
以⼗六进制形式输出⽆符号整数(不输出前缀Ox)u
以⼗进制形式输出⽆符号整数f
以⼩数形式输出单、双精度实数e,E
以指数形式输出单、双精度实数g,G
以%f 或%e 中较短的输出宽度输出单、双精度实数c
输出单个字符s 输出字符串
01. #include <stdio.h>
02. int main (void ){
03. int a =88,b =89;
04. printf ("%d %d\n",a ,b );
05. printf ("%d,%d\n",a ,b );
06. printf ("%c,%c\n",a ,b );
07. printf ("a=%d,b=%d",a ,b );
08. return 0;
09. }
2) 标志
标志字符为 -、+、# 和空格四种,其意义下表所⽰:
标 志
意义-
结果左对齐,右边填空格+
输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
#对c 、s 、d 、u 类⽆影响;
对o 类,在输出时加前缀o ;
对x 类,在输出时加前缀0x ;
对e 、g 、f 类当结果有⼩数时才给出⼩数点。
3) 输出最⼩宽度
⽤⼗进制整数来表⽰输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
4) 精度
精度格式符以“.”开头,后跟⼗进制整数。本项的意义是:如果输出数字,则表⽰⼩数的位数;如果输出的是字符,则表⽰输出字符的个数;若实际位数⼤于所定义的精度数,则截去超过的部分。
5) 长度
长度格式符为h 、l 两种,h 表⽰按短整型量输出,l 表⽰按长整型量输出。
【例4-4】
运⾏结果:
01. #include <stdio.h>
02. int main (void ){
03. int a =15;
04. long float b =123.1234567;
05. // 原来b 的定义为 float b=123.1234567;
06. // 经读者反馈,笔者发现会溢出,在前⾯加了long
07. double c =12345678.1234567;
08. char d ='p';
09.
10. printf ("a=%d\n", a );
11. printf ("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a ,a ,a ,a ); // %% 可以输出 %
12.
13. printf ("a=%f\n", b );
14. printf ("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b ,b ,b ,b );
15.
16. printf ("c=%f\n", c );
printf怎么输出字符17. printf ("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c ,c ,c );
18.
19. printf ("d=%c\n", d );
20. printf ("d(%%c)=%c, d(%%8c)=%8c\n",d ,d );
21. return 0;
22. }
本例中:
使⽤printf函数时还要注意⼀个问题,那就是输出表列中的求值顺序。不同的编译系统不⼀定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进⾏的。请看下⾯两个例⼦。
【例4-5】在⼀个printf()⾥输出
01. #include<stdio.h>
02. int main(void){
03. int i=8;
04. printf("The raw value: i=%d\n", i);
05. printf("++i=%d \n++i=%d \n--i=%d \n--i=%d\n",++i,++i,--i,--i);
06. return0;
07. }
运⾏结果:
The raw value: i=8
++i=8
++i=7
--i=6
--i=7
【例4-6】在多个printf()⾥输出
01. #include<stdio.h>
02. int main(void){
03. int i=8;
04. printf("The raw value: i=%d\n", i);
05. printf("++i=%d\n",++i);
06. printf("++i=%d\n",++i);
07. printf("--i=%d\n",--i);
08. printf("--i=%d\n",--i);
09. return0;
10. }
运⾏结果:
The raw value: i=8
++i=9
++i=10
--i=9
--i=8
这两个程序的区别是⽤⼀个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是⾃右⾄左进⾏的。
但是必须注意,求值顺序虽是⾃右⾄左,但是输出顺序还是从左⾄右,因此得到的结果是上述输出结果。
注意:经读者反馈,我们发现原来的例⼦在VC6.0下计算过程⽐较复杂,不能直观的说明⾃右向左的求值顺序。上⾯的代码是修改后的,修改⽇期为 2014-07-05。
下⾯是⽼代码及分析:
【例4-5】
main(){
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}
【例4-6】
main(){
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
这两个程序的区别是⽤⼀个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是⾃右⾄左进⾏的。在第⼀例中,先对最后⼀项“-i--”求值,结果为-8,然后i⾃减1后为7。再对“-i++”项求值得-7,然后i⾃增1后为8。再对“i--”项求值得8,然后i再⾃减1后为7。再求“i++”项得7,然后i再⾃增1后为8。再求“--i”项,i先⾃减1后输出,输出值为7。最后才求输出表列中的第⼀项“++i”,此时i⾃增1后输出8。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论