2009-10-20 84 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