2009-10-20 51 views
1

当我在工作时,遇到了别人写的代码。 我看到一个语句,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_nostatic int并且它没有小数。

回答

7

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的示例),但它似乎不是实际的错误。

+0

是的,这就是我的疑问......如果%04d服务于相同的目的,为什么.4被添加到它? – Vijay 2009-10-20 13:40:37

+1

+1注意到“%04.4d”超出了必要的范围。实际上,忽略“0”:在sprintf手册页中:“如果精度是通过数字转换(d,i,o,u,x和X)给出的,则忽略0标志。” – Heinzi 2009-10-20 13:43:27

+0

谢谢你指出。我修改了答案。 – 2009-10-20 14:02:46

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不需要,并且由发出适当的警告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 
+1

不,他问为什么是'%04'后'.4'。 – 2009-10-20 13:36:40

0

看这里:sprintf

。数:对于整数说明符(d,I,O,U,X,X):精度指定的要写入的最小位数...

它已验证。

1

“点无论”指定的精度。据的sprintf的man页面,这意味着以下的整数(d):

精度,如果有的话,给人的必须 出现的最小位数;如果转换后的值需要更少的数字,则在左侧用012填充 。

0

%04.4d意味着对应的参数是一个int,它应该与场宽度4和精度前导零被打印4.

似乎正确我(假设输出的样子你要)。

+0

是的,我同意,但是为什么.4被添加到它,因为04d提供相同的输出。 – Vijay 2009-10-20 13:42:11

0

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

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

看到这里

link text

+0

“r” - >“4”在这里我想。 – 2009-10-20 13:35:21

+0

如果%04d服务于相同的目的,为什么将.4添加到它? – Vijay 2009-10-20 13:41:15

+0

谢谢Kinopiko,修正了错字 – pxb 2009-10-20 13:41:17