使用ISO C99 printf(“%Nd”)的前导零默认行为?

时间:2012-01-30 04:11:47

标签: c printf c99 iso

我刚刚在C99 ISO标准7.19.6.1 The fprintf function第6小节中发现了以下内容,详细说明了转换标志,特别是0标志:

  

0: d,i,o,u,x,X,a,A,e,E,f,F,g和G转换,前导零(跟随任何符号指示)或者基数)用于填充场宽而不是执行空间填充,除非转换无穷大或NaN。

到目前为止,我知道以下几行将产生显示的输出:

printf ("%5d\n", 7);   // produces "    7"
printf ("%05d\n",7);   // produces "00007"

但是,在第8小节详述转换修饰符时,我看到:

  

d,i: int参数在样式[ - ] dddd中转换为带符号的十进制数。精度指定要显示的最小位数;如果转换的值可以用较少的数字表示,则使用前导零进行扩展。

显然并非如此,因为默认行为是使用空格填充,不是零。或者我在这里误读了什么?

1 个答案:

答案 0 :(得分:7)

您会混淆精度字段宽度

printf("%.5i",  1);  // prints "00001", precision = 5
printf("%5i",   1);  // prints "    1", field width = 5
printf("%5.3i", 1);  // prints "  001", field width = 5, precision = 3