热门问题
时间线
聊天
视角

格式化字串

来自维基百科,自由的百科全书

Remove ads

格式化字串(英語:format string)是一些程式語言的輸入/輸出中能將字串參數轉換為另一種形式輸出的函數。例如C、C++等程式語言的printf類函數,其中的轉換說明(conversion specification)用於把隨後對應的0個或多個函數參數轉換為相應的格式輸出;格式化字串中轉換說明以外的其它字元原樣輸出。[1]

Thumb
一個printf函數的例子

C語言printf函數為代表的一類

格式化預留位置

格式化字串中的預留位置用於指明輸出的參數值如何格式化。

格式化預留位置(format placeholder),語法是:

%[parameter][flags][field width][.precision][length]type

Parameter可以忽略或者是:

更多資訊 字元, 描述 ...

Flags可為0個或多個:

更多資訊 字元, 描述 ...

Field Width給出顯示數值的最小寬度,典型用於制表輸出時填充固定寬度的表目。實際輸出字元的個數不足域寬,則根據左對齊或右對齊進行填充。實際輸出字元的個數超過域寬並不引起數值截斷,而是顯示全部。寬度值的前導0被解釋為0填充標誌,如上述;前導的負值被解釋為其絕對值,負號解釋為左對齊標誌。如果域寬值為*,則由對應的函數參數的值為當前域寬。

Precision通常指明輸出的最大長度,依賴於特定的格式化類型。對於d、i、u、x、o的整型數值,是指最小數字位數,不足的位要在左側補0,如果超過也不截斷,預設值為1。對於a,A,e,E,f,F的浮點數值,是指小數點右邊顯示的數字位數,必要時四捨五入或補0;預設值為6。對於g,G的浮點數值,是指有效數字的最大位數;預設值為6。對於s的字串類型,是指輸出的位元組的上限,超出限制的其它字元將被截斷。如果域寬為*,則由對應的函數參數的值為當前域寬。如果僅給出了小數點,則域寬為0。

Length指出浮點型參數或整型參數的長度。此項Microsoft稱為「Size」。可以忽略,或者是下述:

更多資訊 字元, 描述 ...

此外,在ISO C99廣泛接受前,還有幾個平台相關的length選項:

更多資訊 字元, 描述 ...

ISO C99的標頭檔inttypes.h包含了許多巨集,用於平台獨立的printf編碼。例如:

更多資訊 巨集, 定義 ...
Remove ads

類型

Type,也稱轉換說明(conversion specification/specifier),可以是:

更多資訊 字元, 描述 ...

寬度與精度格式化參數可以忽略,或者直接指定,或者用星號"*"表示取對應函數參數的值。例如printf("%*d", 5, 10)輸出"   10";printf("%.*s", 3, "abcdef") 輸出"abc"。

如果函數參數太少,不能匹配所有的格式參數說明符,或者函數參數的類型不匹配,將導致未定義(undefined)行為。過多的函數參數被忽略。許多時候,未定義的行為將導致格式化字串攻擊英語Format string attack

某些編譯器,如GCC,會靜態檢查printf這一類函數的格式化參數並編譯警告存在的問題(當使用編譯標誌-Wall-Wformat)。GCC也會對用戶自訂的printf風格函數做靜態檢查,如果在函數定義時使用了非標準的 __attribute__((format(...)))

具有printf風格函數的程式語言

此外,Windows API的FormatMessage函數也使用格式化字串說明。

Remove ads

參考文獻

Loading content...

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads