| 格式 | 說明 | 對應型別 | 範例輸出 |
|---|---|---|---|
%c | 單一字符 | char (int 提升) | 'A' |
%d, %i | 有號十進位整數 | int | -42 |
%u | 無號十進位整數 | unsigned int | 4294967295 |
%o | 八進位 (無號) | unsigned int | 017 |
%x, %X | 十六進位 (小寫/大寫) | unsigned int | ff / FF |
%f, %F | 定點浮點數 | double (float 提升) | 3.141593 |
%e, %E | 科學記號 (指數) | double | 3.141593e+00 |
%g, %G | 自動選 %f 或 %e (較短者) | double | 3.14159 |
%s | 字串 (以 \0 結尾) | char * | "hello" |
%p | 指標位址 | void * | 0x7ffee3a8 |
%% | 輸出字面 % | — | % |
%[]:掃描字符集合。%[^\n] 讀整行,%[0-9] 只讀數字。%*d:抑制賦值,讀取並丟棄,不儲存對應變數。%10s:寬度限制,最多讀 10 字符(含 \0 需預留空間)。%hhd、%lld、%Lf:長度修飾子分別對應 signed char、long long、long double。%[旗標][寬度][.精度][長度]格式字元
旗標:
- : 左對齊 (預設右對齊)
+ : 強制顯示正負號
空格: 正數前加空格,負數顯示負號
# : 替代形式 (八進位加 0, 十六進位加 0x, 浮點數強制顯示小數點)
0 : 數值右對齊時前導補 0 (而非空格)
寬度:最小欄位寬度,不足補空格/0
精度:.數字
- 整數:最小位數,不足前導補 0
- 浮點數:小數點後位數 (%f/%e) 或最大有效數字 (%g)
- 字串:最大字符數
長度修飾子:
hh : signed char / unsigned char
h : short / unsigned short
(無): int / unsigned int / double
l : long / unsigned long / double (printf) / long double (scanf %Lf)
ll : long long / unsigned long long
L : long double
j : intmax_t / uintmax_t (C99)
z : size_t / ssize_t (C99)
t : ptrdiff_t (C99)
printf("%+010d", 42); // +000000042
printf("%-10s", "hi"); // "hi "
printf("%.2f", 3.14159); // 3.14
printf("%#x", 255); // 0xff
printf("%*.*s", 10, 3, "hello"); // " hel" (寬度10, 精度3)
scanf("%19[^\n]", buf); // 讀一行最多19字符,留1給\0
scanf("%*d %d", &a, &b); // 跳過第一個整數,讀第二個給 b
float 約 7 位有效數字,double 約 15-16 位。printf("%f", f) 會將 float 提升為 double,但精度仍受限於原 float 儲存精度。float f = 1234567.123f; printf("%.6f", f); 可能輸出 1234567.125000(二進制無法精確表示)。scanf("%19s", buf) 防緩衝區溢位。scanf 回傳成功匹配數,若不等於預期參數數,輸入格式錯誤。int c; while ((c=getchar())!='\n' && c!=EOF); 吃掉殘留換行。fgets + sscanf**:逐行讀取再解析,更健壯。建議列印此表貼於工位,寫格式字串時隨時查閱,避免低級錯誤。