我刚刚在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