c语言 - ISO C99 printf ( "%Nd" ) 的前导零默认行为?



我刚刚在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 ("%5dn", 7);   // produces "    7"
printf ("%05dn",7);   // produces "00007"

然而,在第8小节中详细介绍了转换修饰符,我看到:

d,i:int参数转换为样式为[−]dddd的带符号小数。精度指定要显示的最小位数;如果被转换的值可以用更少的数字表示,那么它将用前导零展开。

事实显然并非如此,因为默认行为是用空格填充,而不是零。还是我看错了什么?

您混淆了精度字段宽度

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

最新更新