當我在工作時,遇到了別人寫的代碼。 我看到一個語句,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
並且它沒有小數。
當我在工作時,遇到了別人寫的代碼。 我看到一個語句,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