C语言 printf,函数的格式控制符

C语言中,printf()函数针对输出不同的数据类型,有不同的格式控制符,此处汇总了一些常用的格式控制符:

  • %hd用来输出 short int 类型,hd 是 short decimal 的简写;
  • %d用来输出 int 类型,d 是 decimal 的简写;
  • %ld用来输出 long int 类型,ld 是 long decimal 的简写。
  • %c:输出一个字符。c 是 character 的简写。
  • %s:输出一个字符串。s 是 string 的简写。
  • %f:输出一个小数。f 是 float 的简写。

在输出整数方面,格式控制符和整数的符号是紧密相关的,具体就是:

  • %d 以十进制形式输出有符号数;
  • %u 以十进制形式输出无符号数;
  • %o 以八进制形式输出无符号数;
  • %x 以十六进制形式输出无符号数。

printf函数并不支持“输出负的八进制或者十六进制数”。

下表总结了不同类型的整数,以不同进制的形式输出时对应的格式控制符(--表示没有对应的格式控制符)

shortintlongunsigned shortunsigned intunsigned long
八进制------%ho%o%lo
十进制%hd%d%ld%hu%u%lu
十六进制------%hx 或者 %hX%x 或者 %X%lx 或者 %lX

对于一个有符号的正数,它的符号位是0,当按照无符号数的形式读取时,符号位就变成了数值位,但是该位恰好是0而不是1,因此,用%o或者%x输出,不会有影响;

如果一个有符号整数是负数,这时候用%o或者%x输出,则结果就会大相径庭。

可以说,“有符号正数的最高位是0”这个巧合才使得%o和%x输出有符号数时不会出错

小数的输出格式:

  • %f 以十进制形式输出float类型;
  • %lf 以十进制形式输出double类型;
  • %e 以指数形式输出float类型,输出结果中的 e 小写;
  • %E 以指数形式输出float类型,输出结果中的 E 大写;
  • %le 以指数形式输出double类型,输出结果中的 e 小写;
  • %lE 以指数形式输出double类型,输出结果中的 E 大写。

下面有一段演示代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    float a = 0.302;
    float b = 128.101;
    double c = 123;
    float d = 112.64E3;
    double e = 0.7623e-2;
    float f = 1.23002398;
    printf("a=%e \nb=%f \nc=%lf \nd=%lE \ne=%lf \nf=%f\n", a, b, c, d, e, f);
   
    return 0;
}

输出结果为:

a=3.020000e-01

b=128.100998

c=123.000000

d=1.126400E+05

e=0.007623

f=1.230024

对代码的说明:

  • %f 和 %lf 默认保留六位小数,不足六位以 0 补齐,超过六位按四舍五入截断
  • 将整数赋值给 float 变量时会变成小数
  • 以指数形式输出小数时,输出结果为科学计数法;也就是说,尾数部分的取值为:0 ≤ 尾数 < 10。
  • b的输出有点让人不理解,明明初始化的时候,只有三位小数,为什么不能精确输出呢?这和小数在内存中的存储形式有关,很多简单的小数压根不能精确存储,所以也就不能精确输出

另外,小数还有一种更加只能的输出方式,就是使用%g。 %g会对比小数的十进制形式和指数形式,以最短的方式输出小数,让输出结果更加简练。所谓最短,就是输出结果占用最少的字符。

读者需要注意的两点是:

  • %g 默认最多保留六位有效数字,包括整数部分和小数部分;%f 和 %e 默认保留六位小数,只包括小数部分。
  • %g 不会在最后强加 0 来凑够有效数字的位数,而 %f 和 %e 会在最后强加 0 来凑够小数部分的位数。

除了 %g,还有 %lg、%G、%lG:

  • %g 和 %lg 分别用来输出 float 类型和 double 类型,并且当以指数形式输出时,e小写。
  • %G 和 %lG 也分别用来输出 float 类型和 double 类型,只是当以指数形式输出时,E大写。