C格式说明符问题
当我在工作时,遇到了别人写的代码。 我看到一个语句,C格式说明符问题
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
并且它没有小数。
从FreeBSD manpageman 3 printf
可选的精度,在 一个周期的形式。然后是可选的 数字字符串。如果省略数字串 ,则精度为 零。 这给出的最小位数 出现为d,I,O,U, x和X转换的 小数点为,A,E,E后,出现的 数字个数, f和F 转换,g和G 转换的最大有效数字位数 ,或者要从字符串 打印的字符的最大数目 进行s转换。
所以在这种情况下,%04.4d
,.4
指定应该打印数字的所有四位数字。当然,04
部分只是焊盘用前导零的数目,如果它小于1000。然而,在这种情况下,如上述手册页面状态,
'0' (零)零填充。对于除n以外的所有转换,转换后的 值在左侧填充,而不填充空白,而不填充 。 如果以数字 转换(d,i,o,u,i,x和X)给出精度,则0标志 被忽略。
由于想必所有四个数字将反正印,我的猜测是,这只是一个吃剩的或错字或东西。该语法产生gcc -Wall
编译器警告(请参阅Sinan Unur的示例),但它似乎不是实际的错误。
%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
不需要,并且由发出适当的警告210):
#include <stdio.h>
int main(void) {
int t = 123;
printf("%%04.4d:\t" "%04.4d\n", t);
printf("%%4.4d:\t" "%4.4d\n", t);
printf("%%04d:\t" "%04d\n", t);
printf("%%4d:\t" "%4d\n", t);
return 0;
}
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: %4.4d: %04d: %4d: 123
不,他问为什么是'%04'后'.4'。 – 2009-10-20 13:36:40
“点无论”指定的精度。据的sprintf的man页面,这意味着以下的整数(d):
精度,如果有的话,给人的必须 出现的最小位数;如果转换后的值需要更少的数字,则在左侧用012填充 。
%04.4d意味着对应的参数是一个int,它应该与场宽度4和精度前导零被打印4.
似乎正确我(假设输出的样子你要)。
是的,我同意,但是为什么.4被添加到它,因为04d提供相同的输出。 – Vijay 2009-10-20 13:42:11
是的,这就是我的疑问......如果%04d服务于相同的目的,为什么.4被添加到它? – Vijay 2009-10-20 13:40:37
+1注意到“%04.4d”超出了必要的范围。实际上,忽略“0”:在sprintf手册页中:“如果精度是通过数字转换(d,i,o,u,x和X)给出的,则忽略0标志。” – Heinzi 2009-10-20 13:43:27
谢谢你指出。我修改了答案。 – 2009-10-20 14:02:46