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\

范例6-3-02:使用printf函数输出变量的赋值

源码路径:演练范例\6-3-02\

上述代码输出了变量a和b的值4次。因为格式控制字符串不同,所以输出的结果也不相同。其中在第4行的输出语句中,两格式串%d之间加了一个空格(非格式字符),所以在输出的a和b之间有一个空格。在第5行的printf语句格式控制字符串中加入的是非格式字符逗号,因此在输出的a和b之间加了一个逗号。第6行的格式串要求按字符型输出a和b值。在第7行中为了提示输出结果又增加了非格式字符串。

执行后将在界面中输出不同格式的a和b值,如图6-4所示。

图6-4 执行效果

在上述实例代码中,使用printf函数可输出不同格式的a和b的数据。读者需要注意的是,printf函数只能输出字符串,并且只能是一个字符串。

2.格式字符串

使用格式字符串的一般格式如下。

    %[标志][输出最小宽度][.精度][长度]格式字符

其中,方括号“[]”中的部分为可选项。在上述格式中各选项的具体说明如下所示。

❑ 格式字符。

格式字符用于标识输出数据的类型,各个格式字符的具体说明如表6-1所示。

表6-1 格式字符的说明

❑ 标志字符。

标志字符有-、+、#和空格4种,具体说明如表6-2所示。

表6-2 标志字符的说明

❑ 输出最小宽度。

用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或零。

❑ 精度。

精度格式符以“.”开头,后跟十进制整数。本项的意义是如果输出的是数字,则它表示小数的位数;如果输出的是字符,则它表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

❑ 长度。

长度格式符有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\

范例6-4-02:使用printf函数输出数值

源码路径:演练范例\6-4-02\

上述代码的第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所示。

图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。