阅读 ‧ 电子书库 警  告
不要忘记给控制字符串后面的列表中的每个项目都使用一个转换说明。若忘记这个基本的要求将是一件可怕的事情。千万不要写出下面这样的语句:
printf (“The score was Squids %d, Slugs %d.\n”, score1);
这里没有值使用第二个%d。这种错误语句的结果取决于您的系统,就算在最好的情况下,您也只能得到无意义的值。

如果您只想打印一个语句,那么您就不需要任何转换说明;如果您只想打印数据,您无须加入任何说明内容。程序清单4.6中,下列每个语句都是可接受的:

printf (“Farewell! thou art too dear for my possessing, \n”);

printf (“%c%d\n”, ‘$’, 2 * cost);

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

请注意在第二个语句中,打印列表的第一项是一个字符常量而非变量,而第二项则是一个乘法表达式。这就说明了printf()使用的是值,无论该值是变量、常量还是表达式。

因为printf()函数使用%符号来标识转换说明,所以打印%符号本身就成了一个小问题。如果您单独使用一个%符号,那么编译器就会认为您丢掉了一个转换说明符号。解决办法很简单,就是使用两个%符号。

pc = 2*6;

printf (“Only %d%% of Sally's gribbles were edible. \n”s, pc);

下面是输出结果:

Only 12% of Sally's gribbles were edible.

4.4.3 printf()的转换说明修饰符

可以在%和定义转换字符之间通过插入修饰符对基本的转换说明加以修改。表4.4和4.5列出了可以插入的合法字符。如果使用了一个以上的修饰符,那么它们应该与其表4.4中出现的顺序相同。并不是所有的组合都是可能的。该表中有些是C99新增加的部分,您的C实现也许还不支持这里所示的所有选项。

表4.4 printf()修饰符

 

 

修饰符 意义
标志 五种标志(-、+、空格、#和0)都将在表4.5中描述。可以使用零个或者多个标志
示例:
digit(s) 字段宽度的最小值。如果该字段不能容纳要打印的数或者字符串,系统就会使用更宽的字段
示例:“%4d”
.digit(s) 精度。对于%e、%E和%f转换,是将要在小数点的右边打印的数字的位数。对于%g和%G转换,是有效数
字的最大位数。对于%s转换,是将要打印的字符的最大数目。对于整数转换,是将要打印的数字的最小位数;
如果必要,要使用前导零来达到这个位数。只使用“.”表示其后跟随一个零,所以%.f与%.0f相同
示例;“%5.2f”打印一个浮点数,它的字段宽度为5个字符,小数点后有两个数字
h 和整数转换说明符一起使用,表示一个short int或unsigned short int类型数值
示例:“%hu”、 “%hx”和“%6.4hd”
hh 和整数转换说明符一起使用,表示一个signed char或unsigned char类型数值
示例:“%hhu”、“%hhx”和“%6.4hhd”
j 和整数转换说明符一起使用,表示一个intmax_t或uintmax_t值
示例:“%jd”和“%8jX”
l 和整数转换说明符一起使用,表示一个long int或unsigned long int类型值
示例:“%ld”和“%81u”
ll 和整数转换说明符一起使用,表示一个long long int或unsigned long long int类型值(C99)
示例;“%lld”和“%8llu”
L 和浮点转换说明符一起使用,表示一个long double值
示例;“%Lf”和“%10.4Le”
t 和整数转换说明符一起使用,表示一个ptrdiff_t值(与两个指针之间的差相对应的类型)(C99)
示例:“%td”和“%12ti”
z 和整数转换说明符一起使用,表示一个size_t值(sizeof返回的类型)(C99)
示例:“%zd”和“%12zx”