在我工作的时候,我遇到了一个由其他人编写的代码。 我看到一个声明,
sprintf(o_params->o_file_name,
"%s_%s_%04.4d_%s_%s.ASC",
"OUTD", "RM", sequence_no, DateStamp_buf1, TimeStamp_buf1
);
在上面的陈述中,我看到%04.4d
。这是一个正确的格式说明符吗?
变量sequence_no
为static int
,且没有小数。
答案 0 :(得分:7)
来自FreeBSD manpage man 3 printf
可选的精度,形式为 一段时间 。然后是可选的 数字串。如果数字字符串是 省略,精度为 零。 这给出了最小数量 为d,i,o,u出现的数字, x和X转换,数量 数字出现在。之后 a,a,e,E,f和F的小数点 转化次数,最大数量 g和G的有效数字 转化次数,或最大数量 要从字符串打印的字符 转换。
因此,在这种情况下,%04.4d
,.4
指定应打印该数字的所有四位数字。当然,04
部分只是填充前导零的数字,如果它小于1000.但是,在这种情况下,如上面的手册页所述,
`0'(零)零填充。对于除n之外的所有转换,转换后的转换 值用零填充在左侧 比空白。 如果使用数字给出精度 转换(d,i,o,u,i,x和X),0标志是 忽略强>
因为无论如何肯定会打印所有四位数字,我的猜测是它只是一个遗留物或错字或其他东西。此语法使用gcc -Wall
生成编译器警告(请参阅Sinan Unur的示例),但它似乎不是实际错误。
答案 1 :(得分:1)
“dot whatever”指定精度。根据sprintf的手册页,这意味着以下内容(d):
精度(如果有)给出必须的最小位数 出现;如果转换后的值需要更少的数字,那就是 用零填充在左边。
答案 2 :(得分:0)
%d
是printf
中整数的格式说明符:
转换说明符及其含义为:
diouxX The int (or appropriate variant) argument is converted to signed decimal (d and i), unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation. The letters ``abcdef'' are used for x conversions; the letters ``ABCDEF'' are used for X conversions. The precision, if any, gives the minimum number of digits that must appear; if the converted value requires fewer digits, it is padded on the left with zeros.
假设,@ Kinopiko的解释是正确的,这里是%4d
与%4.4d
之间的区别(也显示了为什么不需要%04.4d
以及{{1}发出适当的警告}):
gcc
C:\Temp> gcc z.c -o z.exe -Wall z.c: In function 'main': z.c:5: warning: '0' flag ignored with precision and '%d' printf format z.c:5: warning: '0' flag ignored with precision and '%d' printf format C:\Temp> z %04.4d: 0123 %4.4d: 0123 %04d: 0123 %4d: 123
答案 3 :(得分:0)
答案 4 :(得分:0)
%04.4d表示相应的参数为int,应使用前导零打印,字段宽度为4,精度为4。
对我来说似乎是对的(假设输出看起来像你想要的那样)。
答案 5 :(得分:0)