代碼片段
printf("Dimensions: %dx%dx%d\n", length, width, height);
逐字元解析
| 片段 | 類型 | 含義 |
Dimensions: | 字面字元 | 原樣輸出字串 "Dimensions: " |
%d | 格式指定符 | 以有號十進位整數輸出對應引數 (length) |
x | 字面字元 | 原樣輸出字元 'x'(視覺上作為乘號/分隔符) |
%d | 格式指定符 | 輸出 width |
x | 字面字元 | 原樣輸出 'x' |
%d | 格式指定符 | 輸出 height |
\n | 轉義序列 | 換行 (LF, ASCII 10) |
關鍵概念區別
1. 格式指定符 vs 字面字元
- 格式指定符:以
% 開頭,後接型別字元 (d, f, c, s, p, x, o, u 等),對應可變參數列表中的引數。
- 字面字元:格式字串中非
% 開頭的字元,原樣輸出。
在 "%dx%dx%d" 中,%d 是格式指定符,兩個 x 是字面字元,與十六進位格式 %x 無關。
2. %d vs %x
| 格式 | 輸出進制 | 範例 (輸入 255) |
%d / %i | 有號十進位 | 255 |
%x | 無號十六進位 (小寫) | ff |
%X | 無號十六進位 (大寫) | FF |
%#x | 帶 0x 前綴 | 0xff |
3. % 在格式字串中的特殊地位
% 是格式指定符的起始標記。
- 若要輸出字面
%,必須寫 %%:printf("Progress: %d%%\n", 100); → Progress: 100%
執行範例
int length = 10, width = 20, height = 5;
printf("Dimensions: %dx%dx%d\n", length, width, height);
Dimensions: 10x20x5
常見格式指定符速查表
| 指定符 | 對應型別 | 輸出形式 | 常用旗標 |
%d / %i | int | 有號十進位 | %5d 寬度, %-5d 左對齊, %05d 補零 |
%u | unsigned int | 無號十進位 | |
%f | double (float 提升) | 定點小數 | %.2f 2位小數, %10.2f 寬度10 |
%e / %E | double | 科學記號 | %.3e |
%g / %G | double | 自動選 %f 或 %e | %.4g 4位有效數字 |
%c | int (char 提升) | 單一字元 | |
%s | char* | 字串 (至 \0) | %.10s 最大寬度 |
%p | void* | 指標位址 (實作定義) | %p |
%x / %X | unsigned int | 十六進位 | %08X 8位大寫補零 |
%o | unsigned int | 八進位 | |
%% | 無 | 字面 % | |
轉義序列速查
| 序列 | 字元 | ASCII | 說明 |
\n | LF | 10 | 換行 (Unix/Linux) |
\r | CR | 13 | 歸位 (Mac OS 9/Windows 換行一部分) |
\t | HT | 9 | 水平定位符 |
\\ | \ | 92 | 反斜線本身 |
\" | " | 34 | 雙引號 (字串常數內) |
\' | ' | 39 | 單引號 (字元常數內) |
\0 | NUL | 0 | 空字元,字串結束標記 |
\xNN | 十六進位 | - | 如 \x1B = ESC |
\NNN | 八進位 | - | 如 \033 = ESC |
總結
printf 格式字串由 字面字元 與 格式指定符 組成。% 只用於啟動格式指定符,字面 % 需寫 %%。範例中的 x 純粹是視覺分隔符,與十六進位格式 %x 無關。理解這一區別,是掌握 C 語言格式化輸出的基礎。