热门问题
时间线
聊天
视角

格式化字符串

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

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