6.2.3 printf函数
函数printf又称为格式输出函数,关键字中的最后一个字母“f”有“格式”(format)之意。printf函数的功能是按用户指定的格式,把指定的数据显示到显示器上。在前面的实例中,已多次使用过这个函数。
1.printf函数的一般形式
函数printf是一个标准库函数,它的函数原型包含在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。函数printf的一般格式如下。
printf("格式控制字符串",输出表列)
(1)“格式控制字符串”用于指定输出格式。格式控制字符串分为格式字符串和非格式字符串两种。格式字符串是以%开头的字符串,在%后面跟随各种格式的字符,目的是说明输出数据的类型、形式、长度、小数位数等。例如下面的格式。
❑ “%d”表示按十进制整型输出。
❑ “%ld”表示按十进制长整型输出。
❑ “%c”表示按字符型输出。
非格式字符串在输出时按原样输出,在显示中起到提示作用。
(2)“输出表列”给出了各个输出项,要求格式字符串和各输出项在数量和类型上一一对应。
实例6-3
使用printf函数输出不同格式的变量a和b
源码路径daima\6\6-3
本实例的实现文件为“printf.c”,具体实现代码如下。
int main(void) { int a=50, b=55; //声明两个变量 //按不同的格式输出各个变量 printf("%d %d\n", a, b); printf("%d, %d\n", a, b); printf("%c, %c\n", a, b); printf("a=%d, b=%d", a, b); }
拓展范例及视频二维码
范例6-3-01:使用printf函数输出存储的变量
源码路径:演练范例\6-3-01\
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0091_0001.jpg?sign=1738956169-7m7NYDnrY0gZ1GQeJZgODyF448K6aH8L-0-db980fa3402103d8f921f63fdd0e212e)
范例6-3-02:使用printf函数输出变量的赋值
源码路径:演练范例\6-3-02\
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0091_0002.jpg?sign=1738956169-2ceatz2JTP00xcaapfCzLnI57IbZC5vJ-0-1f0c0612dfc7ba6a94e938dfcbc70d20)
上述代码输出了变量a和b的值4次。因为格式控制字符串不同,所以输出的结果也不相同。其中在第4行的输出语句中,两格式串%d之间加了一个空格(非格式字符),所以在输出的a和b之间有一个空格。在第5行的printf语句格式控制字符串中加入的是非格式字符逗号,因此在输出的a和b之间加了一个逗号。第6行的格式串要求按字符型输出a和b值。在第7行中为了提示输出结果又增加了非格式字符串。
执行后将在界面中输出不同格式的a和b值,如图6-4所示。
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0091_0003.jpg?sign=1738956169-SdkZ9gzkOhA4wkKOw3x3kliVRhMFyu3O-0-c929f2ddcf0a447d3d901fdbd418d0da)
图6-4 执行效果
在上述实例代码中,使用printf函数可输出不同格式的a和b的数据。读者需要注意的是,printf函数只能输出字符串,并且只能是一个字符串。
2.格式字符串
使用格式字符串的一般格式如下。
%[标志][输出最小宽度][.精度][长度]格式字符
其中,方括号“[]”中的部分为可选项。在上述格式中各选项的具体说明如下所示。
❑ 格式字符。
格式字符用于标识输出数据的类型,各个格式字符的具体说明如表6-1所示。
表6-1 格式字符的说明
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0091_0004.jpg?sign=1738956169-j50Zpc3Tb438fHTpR1czFQerVZboposn-0-77b0bc6d0feb218d552931d1bee111dd)
❑ 标志字符。
标志字符有-、+、#和空格4种,具体说明如表6-2所示。
表6-2 标志字符的说明
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0092_0002.jpg?sign=1738956169-u8NRMRpHQC5nQzDFoMtCO78ouG307BQA-0-8f6ad2e8c845d5cda2ce5f2b8967160d)
❑ 输出最小宽度。
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或零。
❑ 精度。
精度格式符以“.”开头,后跟十进制整数。本项的意义是如果输出的是数字,则它表示小数的位数;如果输出的是字符,则它表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
❑ 长度。
长度格式符有h和l两种,其中h表示按短整型输出,l表示按长整型输出,它们可以加在d、o、x和u的前面。
实例6-4
通过printf格式字符函数输出指定格式的数据
源码路径daima\6\6-4
本实例的实现文件为“printf.c”,具体的实现代码如下。
int main(void){ //声明变量 int a=15; float b=123.4567890; double c=12345678.1234567; char d='p'; //按各种格式输出 printf("a=%d, %5d, %o, %x\n", a, a, a, a); printf("b=%f, %lf, %5.4lf, %e\n", b, b, b, b); printf("c=%lf, %f, %8.4lf\n", c, c, c); printf("d=%c, %8c\n", d, d); }
拓展范例及视频二维码
范例6-4-01:在表达式中使用printf函数
源码路径:演练范例\6-4-01\
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0092_0003.jpg?sign=1738956169-H2RwSiyxIYa1fKovoaLAp7QcyhdK1BmR-0-f27340e3cd709ab8532b392ee6f6c52d)
范例6-4-02:使用printf函数输出数值
源码路径:演练范例\6-4-02\
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0092_0004.jpg?sign=1738956169-ogS7QJg5g6Mi3CoKilwLBLTw3sxNQdQo-0-7e1d2d38ee93012e3e5eb4372b62e99f)
上述代码的第9行以4种格式输出整型变量a的值,其中%5d要求输出宽度为5,而a值为15只有两位故要补3个空格。第10行以4种格式输出实型变量b的值。其中%f和%lf格式的输出相同,这说明l对“f”类型无影响。%5.4lf指定输出宽度为5,精度为4,由于实际长度超过5位故应该按实际位数输出,截去小数位数超过4位的部分。第11行输出双精度实数%8.4lf,由于它的指定精度为4位故截去了超过4位的部分。第12行输出字符变量d,其中%8c指定输出宽度为8故在输出字符p之前需补加7个空格。
程序执行后将分别在4行中输出不同格式的变量值,如图6-5所示。
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0093_0001.jpg?sign=1738956169-CaWHuSJIS4HM0TaFa1nKkAPWvt9GQRrt-0-0aefb4539c1f65cd5ab23fa659ab8b7b)
图6-5 执行效果
当在C程序中使用函数printf时,需要注意如下4点。
(1)除了X、E、G之外,其他格式字符必须用小写字母表示,例如%c不能写成%C。
(2)d、o、x、u、c、s、f、e、g等字符用在“%”后面时为格式符号。一个格式字符串以“%”开头。上述格式字符中的一个结束后,在该格式字符串前和后的字符不会误认为是该格式字符串的内容。
(3)如果想输出字符“%”,则应该在格式控制字符串中用两个连续的%来表示,例如:
printf("%f%%",1.0/3);
(4)在使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,它可能是从左到右,也可能是从右到左。Turbo C是按从右到左执行的。请看下面的两段代码。
第一段代码如下。
int main(void){ int i=8; printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++, -i--); }
第二段代码如下。
int main(void){ 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--); }
上述两段程序的区别是:第1个程序用一个printf语句进行输出,第2个程序用多个printf语句输出。从结果中可以看出它们是不同的。这是因为printf函数对输出表中各个量的求值顺序是从右至左进行的。在第1个程序中,先对最后一项“-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。