2009-02-19 103 views
1

今天有一些代碼有點驚喜。我在AIX上編譯它,並將警告級別設置爲肛門,以查看可能潛伏的流氓問題。從代碼中爬出一些新東西。爲什麼「%.3i」打印前導零?

1540-2837 (W) '0' flag is disregarded when combined with 
       precision and 'i' printf format. 

在看了這個有問題的路線後,我放了一個小程序來重現它。在多個平臺上進行測試表明它不是AIX特有的。

下面的第一個printf模仿程序中發現的內容。

#include <stdio.h>  
int main(void) 
{ 
    int x = 3; 

    printf("Format 0.3i <%0.3i>\n", x); // prints 003, and AIX does a warning 
    printf("Format .3i <%.3i>\n", x); // prints 003, with no warning 
    printf("Format 3i <%3i>\n", x); // prints 3, with no warning. 

    return 0; 
} 

通常情況下,如果需要前導零,「03i」格式將很好地完成這項工作。

「%.3i」在這裏的真正含義是什麼?

它爲什麼會有這樣的行爲?

回答

5

.X,其中x是一個數字表示「至少打印X」數字,因此%.3i表示打印至少3位數字。如果該數字小於100,則將填充零。

doc on printf

「對於整數說明符(d,I,O,U,X,X):精度指定的最小位數要寫入如果要被寫入的值是比這更短。數字,結果用前導零填充,即使結果更長,值也不會被截斷,精度爲0意味着沒有字符寫入值0。

還有另一個概念,「寬度」(例如「%3i」),它導致輸出一定數量的字符(不一定是數字,而指定的0用來表示這些字符應該是0,如在 「003」,而不是空格,如 「3」)

+0

膠水的巨大globs。我忘了RTFM Daniel謝謝。 – EvilTeach 2009-02-19 23:01:14

0

man 3 printf

如果精度與 數字轉換(d,I,O,U,X,和 給出X),0標誌被忽略。

.指定了精度,因此0被忽略。至於「爲什麼?」它,你不得不問問C標準的作者:)