printf/scanf 格式字符串是 C 語言 I/O 的核心。本文整理**格式控制符完整語法**、**所有轉義字符**、**輸出精度控制**、**正負號顯示技巧**與**常見陷阱**,作為桌面速查手冊。
一、printf 格式控制符完整語法
%[flags][width][.precision][length]type
1. 標誌
| 符號 | 含義 |
- | 左對齊 (默認右對齊) |
+ | **正數顯示 + 號**,負數顯示 - |
空格 | 正數前加空格,負數前 - (與 + 互斥) |
# | 八進制前加 0,十六進制前加 0x/0X,浮點強制顯示小數點 |
0 | 寬度不足時**前導填 0** (數值類型) |
2. 寬度
- 數字:最小輸出寬度,不足左填空格 (或 0)
*:從下一個 int 參數獲取寬度
3. 精度
| 類型 | 含義 |
| 整數 | 最小數字位數 (不足前導 0) |
浮點 (f/e) | 小數點後位數 (四捨五入) |
浮點 (g/G) | 最大有效位數 |
字符串 (s) | 最大字符數 (截斷) |
4. 長度修飾符
| 修飾符 | 對應類型 |
hh | signed char / unsigned char |
h | short / unsigned short |
l | long / unsigned long / double (僅 %lf) |
ll | long long / unsigned long long |
j | intmax_t / uintmax_t |
z | size_t / ssize_t |
t | ptrdiff_t |
L | long double |
5. 類型字符完整表
| 字符 | 參數類型 | 輸出形式 |
d/i | int | 有符號十進制 |
u | unsigned | 無符號十進制 |
o | unsigned | 八進制 |
x/X | unsigned | 十六進制 (abcdef/ABCDEF) |
f | double | 定點小數 (默認 6 位) |
e/E | double | 科學計數法 (1 位整數 + 6 位小數) |
g/G | double | 自動選 f/e (短者),去尾部 0 |
a/A | double | 十六進制浮點 (C99) |
c | int | 單字符 (unsigned char) |
s | char* | 字符串 (至 \0) |
p | void* | 指針地址 (實現定義格式) |
n | int* | **寫入已輸出字符數** (不輸出) |
% | 無 | 字面 % |
二、轉義字符完整表
| 轉義序列 | 含義 | ASCII 碼 |
\a | 響鈴 (BEL) | 0x07 |
\b | 退格 (BS) | 0x08 |
\f | 換頁 (FF) | 0x0C |
\n | 換行 (LF) — **實際為回車換行** | 0x0A |
\r | 回車 (CR) — 光標歸行首 | 0x0D |
\t | 水平製表 (HT) — 通常 4/8 格可配置 | 0x09 |
\v | 垂直製表 (VT) — 僅影響打印機 | 0x0B |
\\ | 反斜槓 | 0x5C |
\' | 單引號 (字符常量中必需) | 0x27 |
\" | 雙引號 (字符串中可選) | 0x22 |
\? | 問號 (避免三字母組) | 0x3F |
\ddd | 1-3 位八進制字符 | - |
\xhh | 1-2 位十六進制字符 | - |
\0 | 空字符 (NULL) | 0x00 |
三、關鍵細節與技巧
- 浮點精度:
float 傳給 %f 自動提升 double,僅前 7 位有效;double 前 15-16 位有效,輸出默認 6 位小數
- 格式不匹配: 編譯器**不檢查**格式字符串與參數類型匹配,運行時輸出垃圾值
- 正負號顯示:
printf("%+d %+d %+d\n", -5, 0, 5); → -5 +0 +5;printf("% d\n", i); 正數前空格
%g vs %e vs %f: %g 總共 6 位有效數字;%e 小數點後 6 位;%f 固定小數點後 6 位
- 字符 vs 字符串引號: 字符常量
'\'' 必須轉義單引號;字符串 "'" 直接用單引號,**勿雙重轉義**
- 上一篇文章: ASP.NET 聯動下拉框實現:服務端構建 JavaScript 實現客戶端無刷新級聯
- 下一篇文章: BigArithmetic:基於快速傅立葉變換的任意精度算術運算靜態類實現
Copyright ©
程式碼之家 All Rights Reserved