C格式说明符问题

时间:2009-10-20 13:22:25

标签: c++ c unix printf

在我工作的时候,我遇到了一个由其他人编写的代码。  我看到一个声明,

sprintf(o_params->o_file_name,
        "%s_%s_%04.4d_%s_%s.ASC",
        "OUTD", "RM", sequence_no, DateStamp_buf1, TimeStamp_buf1
);

在上面的陈述中,我看到%04.4d。这是一个正确的格式说明符吗?

变量sequence_nostatic int,且没有小数。

6 个答案:

答案 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)

%dprintf中整数的格式说明符:

  

转换说明符及其含义为:

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)

看这里:sprintf

.number:对于整数说明符(d,i,o,u,x,X):precision指定要写入的最小位数...

这是有效的。

答案 4 :(得分:0)

%04.4d表示相应的参数为int,应使用前导零打印,字段宽度为4,精度为4。

对我来说似乎是对的(假设输出看起来像你想要的那样)。

答案 5 :(得分:0)

%04.4d看起来对我有效。它不只是一个带有4个字符宽度和4个精度的小数吗?

%[flags][width][.precision][length]specifier

见这里

link text