%[標志][最小寬度][.精度][長度]類型
方括號內為可選項。掌握每個欄位含義,是輸出漂亮、輸入正確的基礎。
| 字符 | 含義 | 適用類型 |
|---|---|---|
d, i | 有符號十進制整數 | int, short |
u | 無符號十進制整數 | unsigned int |
o | 八進制無符號 (無前綴) | unsigned int |
x, X | 十六進制無符號 (無前綴) | unsigned int |
f, F | 十進制小數形式 | float, double |
e, E | 科學計數法 | float, double |
g, G | %f 或 %e 中較短者 | float, double |
c | 單字符 | char (提升為 int) |
s | 字符串 | char * |
p | 指針地址 | void * |
% | 輸出字面 % | — |
| 標志 | 效果 |
|---|---|
- | 左對齊 (默認右對齊) |
+ | 強制顯示正負號 |
空格 | 正數前加空格,負數顯示負號 |
# | 替代形式:o 加 0 前綴;x/X 加 0x/0X;f/e/g 強制保留小數點 |
0 | 寬度填充用 0 而非空格 (配合寬度使用) |
0 標志填 0)。. 開頭 + 十進制整數。
0%*d、%.*s 從參數列表讀取寬度/精度。| 修飾符 | 含義 | 典型搭配 |
|---|---|---|
hh | char / signed char / unsigned char | %hhd, %hhu |
h | short / unsigned short | %hd, %hu |
l (ell) | long / unsigned long / double (scanf) | %ld, %lf |
ll | long long / unsigned long long | %lld, %llu |
L | long double | %Lf |
z | size_t (C99) | %zu |
t | ptrdiff_t (C99) | %td |
j | intmax_t (C99) | %jd |
關鍵區別:printf 中 %f 和 %lf 等效 (float 自動提升為 double);但 scanf 中 %f 對應 float *,%lf 對應 double *,絕不可混淆。
int a = 15;
float b = 138.3576278;
double c = 35648256.3645687;
char d = 'p';
printf("a=%d,%5d,%o,%x\n", a, a, a, a);
// a=15, 15,17,f (%5d 寬度5,前補3空格)
printf("b=%f,%lf,%5.4lf,%e\n", b, b, b, b);
// b=138.357628,138.357628,138.3576,1.383576e+02
// %5.4lf 寬度5精度4,但整數部分已3位,實際輸出超寬按實際
printf("c=%lf,%f,%8.4lf\n", c, c, c);
// c=35648256.364569,35648256.364569,35648256.3646
// %8.4lf 精度4,四捨五入
printf("d=%c,%8c\n", d, d);
// d=p, p (%8c 寬度8,前補7空格)
標準規定:函數參數求值順序未指定 (Unspecified),Turbo C/MSVC 多為右到左,GCC/Clang 可能不同。
int i = 8;
printf("%d %d %d %d %d %d\n", ++i, --i, i--, i++, -i--);
若右到左求值:
-i-- → -8, i=7i++ → 7, i=8i-- → 8, i=7++i → 8, i=8--i → 7, i=7++i → 8, i=8輸出順序仍左到右:8 7 8 7 7 8 (視編譯器而定)。
鐵律:同一語句中避免對同一變量進行帶副作用的多次操作。拆分為多條語句,明確順序,保命又可移植。
%*d:讀取整數但不賦值 (跳過)%[^\n]:讀取整行 (含空格) 直到換行符%3c:精確讀取 3 個字符 (不自動加 \0,需手動處理)%c 除外-Wformat -Wformat-security (GCC/Clang) 捕獲格式字符串漏洞snprintf、sscanf 防緩衝區溢出int32_t 等) 配合 <inttypes.h> 的 PRId32 宏,保證跨平台一致%.17g (double) 或 %.9g (float) 保證往返無損scanf("%255s", buf)格式符看似瑣碎,實則是 C 語言類型系統與輸出模型的投影。徹底理解各欄位語義、長度修飾符與實際類型的對應、求值順序的不確定性,能讓你寫出既漂亮又安全、可移植的 I/O 代碼。下次見到 %08lld 或 %*.*s,請微笑——你已駕馭它們。