为什么“%。3i”打印前导零?

时间:2009-02-19 22:25:37

标签: c printf text-formatting

今天有些代码让人感到意外。我在AIX上编译它,将警告级别设置为anal,以查看潜在的潜在问题。从代码中抓取的新东西。

 1540-2837 (W) '0' flag is disregarded when combined with 
               precision and 'i' printf format.

在查看违规行之后,我整理了一个小程序来重现它。在几个平台上测试它表明它不是AIX特有的。

下面的第一个printf模仿程序中的内容。

#include <stdio.h>    
int main(void)
{
    int x = 3;

    printf("Format 0.3i <%0.3i>\n", x);  // prints 003, and AIX does a warning
    printf("Format  .3i <%.3i>\n", x);   // prints 003, with no warning
    printf("Format   3i <%3i>\n", x);    // prints   3, with no warning.

    return 0;
}

通常情况下,如果需要前导零,格式为“03i”可以很好地完成工作。

“%。3i”在这里的含义是什么?

为什么会出现这种行为?

2 个答案:

答案 0 :(得分:5)

.X,其中x是数字意味着“打印至少X”个数字,因此%.3i表示打印至少3个数字。如果数字小于100,则用零填充。

来自doc on printf

“对于整数说明符(d,i,o,u,x,X):precision指定要写入的最小位数。如果要写入的值小于此数字,则结果以前导填充零。即使结果更长,该值也不会被截断。精度为0意味着没有为值0写入字符。“

还有另一个概念,“宽度”(例如“%3i”),它会导致输出一定数量的字符(不一定是数字,而指定的0用于表示那些字符应为0,如“003”而非空格,如“3”)

答案 1 :(得分:0)

来自man 3 printf

  

如果用a给出精度   数字转换(d,i,o,u,x和   X),忽略0标志。

.指定精度,因此忽略0。至于“为什么?”它,你必须问C标准的作者:)