<p><b>格式化字串</b>（英語：<span lang="en"><b>format string</b></span>）是一些程式設計語言的輸入/輸出庫中能將字串參數轉換為另一種形式輸出的函式。例如C、C++等程式設計語言的printf類函式，其中的轉換說明（conversion specification）用於把隨後對應的0個或多個函式參數轉換為相應的格式輸出；格式化字串中轉換說明以外的其它字元原樣輸出。</p>


<h2><span id="C.E8.AF.AD.E8.A8.80printf.E5.87.BD.E6.95.B0.E4.B8.BA.E4.BB.A3.E8.A1.A8.E7.9A.84.E4.B8.80.E7.B1.BB"></span><span id="C语言printf函数为代表的一类">C語言printf函式為代表的一類</span></h2>
<h3><span id=".E6.A0.BC.E5.BC.8F.E5.8C.96.E5.8D.A0.E4.BD.8D.E7.AC.A6"></span><span id="格式化占位符">格式化預留位置</span></h3>
<p>格式化字串中的預留位置用於指明輸出的參數值如何格式化。
</p><p>格式化預留位置（format placeholder），語法是：
</p>
<dl><dd><code>%[<i>parameter</i>][<i>flags</i>][<i>field width</i>][.<i>precision</i>][<i>length</i>]<i>type</i></code></dd></dl><p><b>Parameter</b>可以忽略或者是： 
</p>
<dl><dd></dd></dl><p><b>Flags</b>可為0個或多個：
</p>
<dl><dd></dd></dl><p><b>Field Width</b>給出顯示數值的最小寬度，典型用於制表輸出時填充固定寬度的表目。實際輸出字元的個數不足域寬，則根據左對齊或右對齊進行填充。實際輸出字元的個數超過域寬並不引起數值截斷，而是顯示全部。寬度值的前導0被解釋為0填充標誌，如上述；前導的負值被解釋為其絕對值，負號解釋為左對齊標誌。如果域寬值為<code>*</code>，則由對應的函式參數的值為當前域寬。
</p><p><b>Precision</b>通常指明輸出的<i>最大</i>長度，依賴於特定的格式化類型。對於d、i、u、x、o的整型數值，是指最小數字位數，不足的位要在左側補0，如果超過也不截斷，預設值為1。對於a,A,e,E,f,F的浮點數值，是指小數點右邊顯示的數字位數，必要時四捨五入或補0；預設值為6。對於g,G的浮點數值，是指有效數字的最大位數；預設值為6。對於s的字串類型，是指輸出的位元組的上限，超出限制的其它字元將被截斷。如果域寬為<code>*</code>，則由對應的函式參數的值為當前域寬。如果僅給出了小數點，則域寬為0。
</p><p><b>Length</b>指出浮點型參數或整型參數的長度。此項Microsoft稱為「Size」。可以忽略，或者是下述：
</p>
<dl><dd></dd></dl><p>此外，在ISO C99廣泛接受前，還有幾個平台相關的length選項：
</p>
<dl><dd></dd></dl><p>ISO C99的標頭檔<code>inttypes.h</code>包含了許多巨集，用於平台獨立的<code>printf</code>編碼。例如：
</p>
<dl><dd></dd></dl><h3><span id=".E7.B1.BB.E5.9E.8B"></span><span id="类型">類型</span></h3>
<p><b>Type</b>，也稱轉換說明（conversion specification/specifier），可以是：
</p>
<dl><dd></dd></dl><p>寬度與精度格式化參數可以忽略，或者直接指定，或者用星號"<code>*</code>"表示取對應函式參數的值。例如<code>printf("%*d", 5, 10)</code>輸出"<code>   10</code>"；<code>printf("%.*s", 3, "abcdef")</code> 輸出"<code>abc</code>"。
</p><p>如果函式參數太少，不能匹配所有的格式參數說明符，或者函式參數的類型不匹配，將導致未定義（undefined）行為。過多的函式參數被忽略。許多時候，未定義的行為將導致<span data-orig-title="格式化字符串攻击" data-lang-code="en" data-lang-name="英語" data-foreign-title="Format string attack"><span>格式化字串攻擊</span></span>。
</p><p>某些編譯器，如GCC，會靜態檢查printf這一類函式的格式化參數並編譯警告存在的問題（當使用編譯標誌<code>-Wall</code>或<code>-Wformat</code>）。GCC也會對使用者自訂的printf風格函式做靜態檢查，如果在函式定義時使用了非標準的 <code>__attribute__((format(...)))</code>。
</p>
<h3><span id=".E5.85.B7.E6.9C.89printf.E9.A3.8E.E6.A0.BC.E5.87.BD.E6.95.B0.E7.9A.84.E7.BC.96.E7.A8.8B.E8.AF.AD.E8.A8.80"></span><span id="具有printf风格函数的编程语言">具有printf風格函式的程式語言</span></h3>

<p>此外，Windows API的FormatMessage函式也使用格式化字串說明。
</p>
<h2><span id=".E5.8F.82.E8.80.83.E6.96.87.E7.8C.AE"></span><span id="参考文献">參考文獻</span></h2>

<h2><span id=".E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5"></span><span id="外部链接">外部連結</span></h2>
<ul><li>C++ reference for <code>std::fprintf</code> （頁面存檔備份，存於網際網路檔案館）</li>
<li>gcc printf format specifications quick reference （頁面存檔備份，存於網際網路檔案館）</li>
<li><span><code>printf</code></span>: print formatted output – 系統介面（System Interfaces）參考，單一UNIX®規範第7期，由國際開放標準組織發布</li>
<li>The <code>Formatter</code> specification （頁面存檔備份，存於網際網路檔案館） in Java 1.5</li>
<li>GNU Bash <code>printf(1)</code> builtin （頁面存檔備份，存於網際網路檔案館）</li></ul><p class="mw-empty-elt">



</p>
<!-- 
NewPP limit report
Parsed by mw2401
Cached time: 20230505132425
Cache expiry: 1814400
Reduced expiry: false
Complications: [show‐toc]
CPU time usage: 0.461 seconds
Real time usage: 0.570 seconds
Preprocessor visited node count: 1980/1000000
Post‐expand include size: 302608/2097152 bytes
Template argument size: 1978/2097152 bytes
Highest expansion depth: 11/100
Expensive parser function count: 41/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 2788/5000000 bytes
Lua time usage: 0.216/10.000 seconds
Lua memory usage: 20528380/52428800 bytes
Number of Wikibase entities loaded: 0/400
--><!--
Transclusion expansion time report (%,ms,calls,template)
100.00%  372.065      1 -total
 30.75%  114.424      1 Template:Lang-en
 27.10%  100.845      2 Template:Navbox
 23.33%   86.801     36 Template:Tsl
 22.01%   81.875      1 Template:Unix_commands
 16.08%   59.822      1 Template:NoteTA
 11.48%   42.701      1 Template:Reflist
 10.21%   38.002      1 Template:Cite_web
  6.97%   25.922      1 Template:CProLang
  2.11%    7.853      1 Template:Div_col
-->
**格式化字串**（英語：**format string**）是一些程式設計語言的輸入 / 輸出庫中能將字串參數轉換為另一種形式輸出的函式。例如 C、C++ 等程式設計語言的 printf 類函式，其中的轉換說明（conversion specification）用於把隨後對應的 0 個或多個函式參數轉換為相應的格式輸出；格式化字串中轉換說明以外的其它字元原樣輸出。

## 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` 編碼。例如：

　
:

### 類型

**Type**，也稱轉換說明（conversion specification/specifier），可以是：

　
:

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

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

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

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

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

## 參考文獻

## 外部連結

* C++ reference for `std::fprintf` （頁面存檔備份，存於網際網路檔案館）
* gcc printf format specifications quick reference （頁面存檔備份，存於網際網路檔案館）
* `printf`: print formatted output – 系統介面（System Interfaces）參考，單一 UNIX® 規範第 7 期，由國際開放標準組織發布
* The `Formatter` specification （頁面存檔備份，存於網際網路檔案館） in Java 1.5
* GNU Bash `printf(1)` builtin （頁面存檔備份，存於網際網路檔案館）
%s