C語言格式化輸出完整速查表:printf/scanf 格式字串、標誌、寬度、精度、長度修飾符
printf/scanf 格式字串是 C 語言 I/O 的核心,參數繁多易混淆。本文系統整理所有轉換指示符、標誌、寬度、精度、長度修飾符,並附帶實例對照表,適合列印貼在螢幕邊隨時查閱。
轉換指示符完整表
| 指示符 | 意義 | 對應類型 | 範例輸出 |
%d, %i | 有號十進位整數 | int | 42, -7 |
%u | 無號十進位整數 | unsigned int | 42 |
%o | 八進位 | unsigned int | 52 |
%x, %X | 十六進位 (小寫/大寫) | unsigned int | 2a, 2A |
%f | 定點浮點數 | double | 3.141593 |
%e, %E | 科學記號 | double | 3.141593e+00 |
%g, %G | 自動選 %f/%e 較短者 | double | 3.14159 |
%a, %A | 十六進位浮點數 (C99) | double | 0x1.921fbp+1 |
%c | 單一字元 | int (提升自 char) | A |
%s | 字串 (以 \0 結尾) | char* | Hello |
%p | 指標位址 | void* | 0x7ffee8c0 |
%% | 字面 % 字元 | — | % |
%n | 已輸出字元數寫入指標 | int* | — |
格式字串完整語法
%[標誌][寬度][.精度][長度]指示符
標誌
| 標誌 | 效果 |
- | 左對齊 (預設右對齊) |
+ | 正數也顯示 + 號 |
空格 | 正數前加空格,負數顯示 - |
# | 替代形式:%o 加 0,%x 加 0x,%f/%e 強制顯示小數點 |
0 | 寬度不足時左側補 0 (數值類型) |
寬度與精度
%10d:最寬 10 字元,不足左補空格
%.5f:小數點後 5 位
%10.3f:寬 10,小數 3 位
%-10s:左對齊,寬 10
%.*f:精度由參數指定 printf("%.*f", 3, 3.14159) → 3.142
長度修飾符
| 修飾符 | 適用指示符 | 意義 |
hh | d,i,o,u,x,X,n | signed char, unsigned char |
h | d,i,o,u,x,X,n | short, unsigned short |
l (ell) | d,i,o,u,x,X,n | long, unsigned long |
ll | d,i,o,u,x,X,n | long long, unsigned long long |
l | f,e,E,g,G,a,A | double (預設即 double,%lf 同 %f) |
L | f,e,E,g,G,a,A | long double |
j | d,i,o,u,x,X,n | intmax_t, uintmax_t |
z | d,i,o,u,x,X,n | size_t, ssize_t |
t | d,i,o,u,x,X,n | ptrdiff_t |
scanf 專用細節
%[] 掃描集合:%[abc] 只讀 a/b/c,%[^abc] 讀非 a/b/c
%*d 抑制賦值:讀取但不存入變數
%n 同 printf,寫入已讀字元數
- 掃描集、抑制賦值不計入返回值
經典實例對照
printf("%04d", 7); // 0007
printf("%+d", 7); // +7
printf("% d", 7); // 7 (前面有空格)
printf("%#x", 255); // 0xff
printf("%.2f", 3.14159); // 3.14
printf("%10.2f", 3.14); // " 3.14" (前6空格)
printf("%-10.2f", 3.14); // "3.14 " (後6空格)
printf("%s", "Hello"); // Hello
printf("%.3s", "Hello"); // Hel
printf("%10.3s", "Hello"); // " Hel"
scanf("%19s", buf); // 最多讀19字元防溢位
scanf("%[^\n]", line); // 讀整行含空格
掌握格式字串細節,能精確控制輸出格式、防止緩衝區溢位、解析複雜輸入,是 C 語言工程師的基本功。