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

C 为什么“%”。3i“;打印前导零?,c,printf,text-formatting,C,Printf,Text Formatting,今天有些代码让人有点惊讶。我是在AIX上编译它的,警告级别设置为anal,以查看潜在的恶意问题。代码中出现了新的内容 1540-2837 (W) '0' flag is disregarded when combined with precision and 'i' printf format. 在看了这句令人不快的话之后,我编写了一个小程序来重现它。在多个平台上测试表明,它不是AIX特有的 下面的第一个printf模拟了在程序中发现的内容 #include

今天有些代码让人有点惊讶。我是在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;
}
#包括
内部主(空)
{
int x=3;
printf(“格式0.3i\n”,x);//打印003,AIX发出警告
printf(“Format.3i\n”,x);//打印003,没有警告
printf(“格式3i\n”,x);//打印3,没有警告。
返回0;
}
通常,如果需要前导零,则“03i”格式可以很好地完成这项工作

这里“%.3i”的真正含义是什么?


为什么它会有这样的行为?

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

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


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

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

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


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

来自
man 3 printf

如果精度是用 数字转换(d、i、o、u、x和 十) ,则忽略0标志


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

来自
Man3printf

如果精度是用 数字转换(d、i、o、u、x和 十) ,则忽略0标志


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

伟大的胶球。我忘了给丹尼尔打电话了,谢谢。胶球棒极了。我忘了给丹尼尔打电话了,谢谢。