C 語言標準輸入輸出的核心在於格式字符串,掌握轉換說明符(%d、%f…)、長度修飾符(h、l、ll、L、z、t、j)及標志修飾符(-、+、0、#、空格、寬度、精度)是寫出健壯代碼的基礎。本文整理最新 C11/C18 標準對應表,並釐清 printf/%lf、scanf/%lf 等易混淆點。
| 符號 | 對應類型 | 輸出格式 |
|---|---|---|
d, i | int | 有符號十進制 |
u | unsigned int | 無符號十進制 |
o | unsigned int | 八進制 |
x, X | unsigned int | 十六進制 (小寫/大寫) |
f, F | double | 定點小數 |
e, E | double | 科學計數法 |
g, G | double | 自動選擇 %f/%e |
a, A (C99) | double | 十六進制浮點數 |
c | int (字符) | 單字符 |
s | char * | 字符串 |
p | void * | 指針地址 |
n | int * | 寫入已輸出字符數 |
% | — | 字面 '%' |
| 修飾符 | 對應類型 (printf) | 備註 |
|---|---|---|
hh | signed char / unsigned char | C99 |
h | short / unsigned short | |
| (無) | int / unsigned int / double | float 會自動提升為 double |
l | long / unsigned long / wchar_t* | %ls 輸出寬字符串 |
ll | long long / unsigned long long | C99 |
L | long double | %Lf, %Le, %La |
z | size_t / ssize_t | C99,%zu |
t | ptrdiff_t | C99,%td |
j | intmax_t / uintmax_t | C99,%jd |
%f 統一處理 float/double因默認參數提升規則,float 傳入可變參數函數時自動提升為 double,故 printf **無 %lf**,%f 兼容兩者;long double 必須用 %Lf。但 scanf 需區分:%f→float*、%lf→double*、%Lf→long double*。
轉換說明符與 printf 大體對應,但 無 %g/%a/%n 等輸出專用符,且 所有指針參數必須精確匹配長度修飾符(見上表)。常見錯誤:scanf("%d", &longVar) 應為 %ld。
* 修飾符(賦值抑制/寬度/精度動態指定)%*d:讀取一個 int 但**不賦值**,跳過該輸入項。printf("%*d", width, val):寬度由參數 width 動態指定。printf("%.*f", prec, val):精度由參數 prec 動態指定。printf("%*.*f", width, prec, val):寬度、精度均動態。-Wformat=2 -Wformat-overflow 捕獲不匹配。inttypes.h 宏(PRId64、PRIuPTR…)保證跨平台一致性。scanf 返回值**必須檢查**,防止輸入失敗導致變量未初始化。%*s 限制寬度或改用 fgets 避免緩衝區溢出。