前言
printf/scanf 族函數的靈魂在於**格式控制串**。本文系統整理 Turbo C 2.0 支援的所有格式字符、場寬/精度語法、長度修飾符、對齊控制,並給出常見組合實例,作為查閱手冊與避坑指南。
一、基礎格式字符對照表
| 格式字符 | 輸出/輸入含義 | 適用類型 |
%d / %i | 有符號十進制整數 | int, short |
%u | 無符號十進制整數 | unsigned int |
%f | 十進制浮點數 (固定小數點) | float, double |
%e / %E | 指數科學記數法 | float, double |
%g / %G | 自動選擇 %f 或 %e (較短者) | float, double |
%s | 字符串 (以 '\0' 結尾) | char*, char[] |
%c | 單個字符 | char |
%p | 指針地址 (十六進制) | void* |
%x / %X | 無符號十六進制 (小寫/大寫) | unsigned |
%o | 無符號八進制 | unsigned |
二、場寬與精度控制
語法:%[標誌][場寬][.精度][長度]類型
1. 場寬 (最小字符數)
%3d:最寬 3,不足右對齊填空格。
%9.2f:總寬 9,含小數點 1 位、小數 2 位、整數 6 位,不足右對齊。
%8s:最寬 8,字符串右對齊。
- **超寬不截斷**:數值/字符串實際長度超過場寬時,**按實際長度輸出**(浮點數整數部分超寬同理),唯獨浮點數小數部分超精度時**四捨五入截斷**。
2. 精度 (小數位數 / 最大字符數)
.2 在 %f/%e/%g 中指定小數位數。
.9 在 %s 中限制**最大輸出字符數**(超截斷)。
- 組合
%6.9s:最小寬 6、最大寬 9,不足 6 右對齊,超 9 截尾。
3. 前導零填充
%04d:不足 4 位時**前補 0** 而非空格(負號佔 1 位)。
三、長度修飾符
| 修飾符 | 含義 | 典型搭配 |
l (ell) | 長整型 / 雙精度 | %ld (long), %lf (double) |
h | 短整型 | %hd (short) |
L | 長雙精度 | %Lf (long double) |
注意:printf 中 %f 可接收 float/double (默認提升);scanf **必須**區分 %f (float*) 與 %lf (double*)。
四、對齊控制:標誌字符
| 標誌 | 效果 | 範例 |
- | **左對齊** (默認右對齊) | %-7d、%-10s |
+ | 正數顯示 + 號 | %+d |
space | 正數前置空格 (負數顯示 -) | % d |
# | 替代形式:%#x 加 0x、%#o 加 0、%#f 強制小數點 | %#x |
0 | 數值右對齊時前補 0 (同 %04d) | %04d |
五、綜合實例速查
| 格式串 | 輸入值 | 輸出結果 | 說明 |
%5d | 12 | " 12" | 寬 5 右對齊 |
%-5d | 12 | "12 " | 寬 5 左對齊 |
%05d | 12 | "00012" | 前補 0 |
%8.2f | 123.456 | " 123.46" | 寬 8、小數 2 位、四捨五入 |
%10.4s | "HelloWorld" | " Hello" | 寬 10、最多 4 字符、右對齊 |
%-10.4s | "HelloWorld" | "Hello " | 寬 10、最多 4 字符、左對齊 |
%ld | 1234567890L | "1234567890" | long 整數 |
%p | &var | "0x7ffe..." | 指針地址 |
六、scanf 專屬細節
scanf **忽略格式串中非格式字符**(空白符除外),匹配時自動跳過輸入流空白符。
%[] 掃描集:%[abc] 僅讀 a/b/c,%[^\\n] 讀整行 (含空格)。
%*d 抑制賦值:讀取但不存入變量(用於跳過字段)。
- 地址傳遞:
scanf("%d", &x); 必須取址,否則未定義行為。
七、常見錯誤與修正
| 錯誤代碼 | 問題 | 修正 |
printf("%d", &x); | 傳地址而非值 | printf("%d", x); |
scanf("%d", x); | 傳值而非地址 | scanf("%d", &x); |
printf("%f", d); (d 為 double) | 雖可工作但不規範 | printf("%f", d); 或 %lf (C99+) |
scanf("%f", &d); (d 為 double) | **嚴重錯誤**:寫入 4 字節覆蓋 8 字節 | scanf("%lf", &d); |
%s 無長度限制 | 緩衝區溢出 | %19s (緩衝區 20 字節) |
總結
格式控制串是 printf/scanf 的**領域特定語言 (DSL)**。熟記「類型字符、場寬.精度、長度修飾符、標誌字符」四大維度組合規則,配合 scanf 掃描集與抑制賦值,即可精準控制文本輸入輸出,避免緩衝區溢出、類型不匹配、對齊混亂等經典坑點。