知识点

C格式化输出

定义

printf根据格式串输出文本。普通字符原样输出;以 % 开始的转换说明取用相应实参,并决定它的显示方式。转换说明与实参类型必须匹配,否则行为未定义。

c
printf("%d %.2f\n", 12, 3.14159);

%d输出整数,%f输出浮点数;可变参数调用会把float提升为double。%% 输出一个百分号,返回值是输出的字符数,输出错误时为负值。

性质

一个转换说明可包含标志、最小字段宽度、精度、长度修饰符和转换字符。宽度不足时默认在左侧补空格;- 改为左对齐,0可在数值左侧补零。宽度是最小值,不会截短更长的输出。

对于 %f,精度表示小数点后的位数;对于 %s,精度限制最多输出的字符数。不同转换字符对精度的解释可能不同。

写法含义示例输出
%5d右对齐,宽度至少为5 12
%-5d左对齐,宽度至少为512
%05d不足的宽度补零00012
%8.3f宽度至少为8,小数点后3位 3.142

例子

宽度、补零与精度

format.c
#include <stdio.h>
int main(void) {
printf("[%5d]\n", 12); /* [ 12] */
printf("[%-5d]\n", 12); /* [12 ] */
printf("[%05d]\n", 12); /* [00012] */
printf("[%+d]\n", 12); /* [+12] */
printf("[%.2f]\n", 3.14159); /* [3.14] */
printf("[%8.3f]\n", 3.14159); /* [ 3.142] */
printf("[%.5s]\n", "abcdefg"); /* [abcde] */
printf("100%%\n"); /* 100% */
return 0;
}

同一份数据换一个宽度或精度,输出长度会变,但数值本身不变。

探索

字段宽度和标志怎样影响输出?

比较右对齐、补零和左对齐的整数输出。

正在准备演示…

题集

练习

  1. printf("%05d", 12) 的输出是 。

    参考解答

    宽度5是最小总宽度,不足的部分用0补齐,12占2位,前面补3个零。

  2. printf("%8.3f", 3.14159) 中,小数部分保留 位,输出字段的最小总宽度是 。

    参考解答

    .3是精度,8是最小宽度。3.142只有5个字符,左侧补3个空格后总宽为8。