单片机C语言编程实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 程序运行结果