C語言字符串與格式化輸入輸出完整指南
本文系統整理 C 語言字符串本質、printf/scanf 格式控制完整規範、修飾符與標誌位用法,適合作為快速查閱手冊。
一、字符串本質
- 字符串 = 字符序列,以
\0 (空字符) 結尾
- C 無專用字符串型別,使用
char 陣列儲存
- 陣列大小 ≥ 字符數 + 1(留空間給
\0)
%s 輸出字符串,遇 \0 停止
strlen() 返回字符數(不含 \0),需 <string.h>
sizeof 運算元為型別時加括號,變數/常值可不加
const 修飾變數為只讀
二、printf 格式控制完整規範
1. 轉換說明符
| 說明符 | 輸出內容 | 備註 |
| %d / %i | 有符號十進制整數 | 同義 |
| %u | 無符號十進制整數 | |
| %o | 八進制整數 | 無前綴 |
| %x / %X | 十六進制整數 | 小寫/大寫字母 |
| %f | 十進制浮點數 | 預設 6 位小數 |
| %e / %E | 科學計數法 | e/E 區分大小寫 |
| %g / %G | 自動選擇 %f 或 %e | 短者優先 |
| %a / %A | 十六進制浮點數 (C99) | p 計數法 |
| %c | 單一字符 | |
| %s | 字符串 | 至 \0 為止 |
| %p | 指標地址 | 實現定義格式 |
| %% | 字面 % 號 | |
2. 修飾符完整表
| 修飾符 | 位置 | 含義 | 範例 |
- | 標誌 | 左對齊 | %-10d |
+ | 標誌 | 正數顯示 + 號 | %+d |
空格 | 標誌 | 正數前加空格 | % d |
# | 標誌 | 替代形式 (0x, 0, .0) | %#x |
0 | 標誌 | 前導 0 填充 | %05d |
數字 | 寬度 | 最小欄寬 | %8d |
.* | 寬度 | 由引數指定寬度 | %*d |
.數字 | 精度 | 小數位/最大字符數 | %.3f %.5s |
.* | 精度 | 由引數指定精度 | %.*f |
h | 長度 | short int | %hd |
hh | 長度 | signed char | %hhd |
l | 長度 | long int / double | %ld %lf |
ll | 長度 | long long int (C99) | %lld |
L | 長度 | long double | %Lf |
j | 長度 | intmax_t (C99) | %jd |
z | 長度 | size_t (C99) | %zu |
t | 長度 | ptrdiff_t (C99) | %td |
3. 完整格式語法
%[標誌][寬度][.精度][長度]轉換說明符
三、scanf 格式控制
- 轉換說明符與
printf 大多相同
- 返回值:成功讀取項目數,EOF (-1) 表示檔案結尾
* 抑制賦值:%*d 跳過一個整數
- 掃描集合:
%[abc] 僅讀 a/b/c,%[^abc] 排除 a/b/c
- 輸入緩衝區機制:輸入先進緩衝區,
scanf 按格式提取
四、常見陷阱與最佳實踐
| 陷阱 | 正確做法 |
scanf("%s", str) 緩衝區溢出 | scanf("%19s", str) 限制寬度 |
%f 讀取 double | double 用 %lf,printf 同用 %f |
| 忽略返回值檢查 | 檢查返回值 == 預期項目數 |
緩衝區殘留換行符干擾 %c | scanf(" %c", &ch) 前加空格跳過空白 |
| 格式字串與引數不匹配 | 啟用 -Wformat 編譯檢查 |
五、進階技巧:動態寬度/精度
int w = 8, p = 3;
double val = 3.14159;
printf("%*.*f\n", w, p, val); // 輸出: " 3.142" (寬度8, 精度3)
掌握格式化 I/O 的完整規範,不僅能避免常見 Bug,更能編寫出對齊美觀、精度可控、健壯性強的輸出代碼。建議收藏本表格作為開發時的快速參考卡。