【问题标题】:Why does "%.3i" print leading zeros?为什么“%.3i”打印前导零?
【发布时间】:2009-02-19 22:25:37
【问题描述】:

今天的一些代码有点意外。我在 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”在这里的真正含义是什么?

为什么会有它的行为?

【问题讨论】:

    标签: c printf text-formatting


    【解决方案1】:

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

    来自doc on printf

    "对于整数说明符(d, i, o, u, x, X):precision指定要写入的最小位数。如果要写入的值比这个数字短,结果用前导填充零。即使结果更长,该值也不会被截断。精度为 0 表示不为值 0 写入任何字符。"

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

    【讨论】:

    • 大量胶水。我忘了 RTFM Daniel 谢谢。
    【解决方案2】:

    来自man 3 printf

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

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

    【讨论】: