有有点今天一些代码的惊喜。我编译它在AIX上,设置到肛门,看看有什么流氓问题可能潜伏的警戒线。新的东西爬出来的代码。

 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” 的真正含义吗?

为什么它具有以下行为:它呢?

有帮助吗?

解决方案

.X,其中x是一个数字是指“至少打印X”的数字,所以%.3i意味着打印至少3位数字。如果该数量小于100,则留用零填充。

从上一个 DOC的printf

“对于整数说明符(d,I,O,U,X,X):精度指定的最小位数要写入如果要被写入的值是比该数更短,结果是填充具有领先。零。该值不会被截断,即使结果为更长。0精度意味着没有字符被作为值0写入。“

还有另一种概念,“宽度”(例如,“%3i的”),其使得要被输出(不一定数字字符的一定数量的,并且指定用于说,这些字符应是0,如在0 “003”,而不是空格,如 “3”)

其他提示

man 3 printf

  

如果一个精度与给定的   数字转换(d,I,O,U,X,和   X),0标志被忽略。

.被指定精度,因此0被忽略。至于“为什么?”这一点,你应该去问C标准的作者:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top