printf 是 C 語言標準庫中最常用的格式化輸出函數,原型:int printf(const char *format, ...);。掌握其格式控制字符串是輸出對齊、精度控制、調試打印的基礎。
%[標志][寬度][.精度][長度]類型
- (左對齊)、+ (顯示符號)、空格 (正數前加空格)、# (替代形式)。- 右填充)。可用 * 由參數指定。.數字 或 .*。對整數:最小位數 (前導 0);對浮點:小數位數;對字符串:最大字符數。hh (char)、h (short)、l (long/double)、ll (long long)、L (long double)、z (size_t)、t (ptrdiff_t)。| 類型 | 對應數據 | 說明 |
|---|---|---|
d, i | 有符號整數 | 十進制輸出。i 掃描時支持八/十六進制輸入,輸出同 d。 |
u | 無符號整數 | 十進制輸出。 |
o | 無符號整數 | 八進制輸出 (無前綴 0)。 |
x, X | 無符號整數 | 十六進制輸出 (小寫/大寫字母),無前綴 0x。配合 # 輸出 0x/0X。 |
f, F | 浮點數 | 十進制小數形式。F 輸出 INF/NAN 大寫。 |
e, E | 浮點數 | 科學計數法 (如 1.23e+04)。 |
g, G | 浮點數 | 自動選擇 f 或 e 中較短者,去除尾部 0。 |
c | 字符 | 輸出單個字符 (int 參數轉 unsigned char)。 |
s | 字符串 | 輸出以 \0 結尾的字符數組。配合精度限制長度。 |
p | 指針 | 輸出指針地址 (通常十六進制帶 0x 前綴)。 |
% | 無 | 輸出字面 %。 |
| 標志 | 效果 | 示例 |
|---|---|---|
- | 左對齊 (默認右對齊) | %-10d → "123 " |
+ | 總是顯示符號 (+/-) | %+d → "+123" |
空格 | 正數前加空格,負數顯示 - | % d → " 123" |
# | 替代形式 | %#x→"0x7b", %#o→"0173", %#f→強制顯示小數點 |
0 | 寬度填充用 0 而非空格 (數值類型,被 - 覆蓋) | %08d → "00000123" |
%ld / %lld:long / long long。必須匹配,否則 UB。%zu / %zd:size_t / ptrdiff_t (C99)。打印 sizeof 結果、數組索引首選。%p:參數必須是 void*,其他指針類型需強轉 (void*)。%hhu / %hhd:打印 unsigned char / signed char 作為整數。int a = 100;
double pi = 3.1415926;
char *str = "Hello";
printf("|%5d|%-5d|%05d|%+d|% d|\n", a, a, a, a, a);
// | 100|100 |00100|+100| 100|
printf("Pi: %.2f, %.4e, %g\n", pi, pi, pi);
// Pi: 3.14, 3.1416e+00, 3.14159
printf("Ptr: %p\n", (void*)str); // 正確打印指針
%d 打印 long long)。%s 打印非以 \0 結尾的內存。%n 佔位符 (將已寫入字符數存入指針) 易導致安全漏洞,禁用或極度謹慎使用。建議開啟編譯器警告 -Wformat -Wformat-security (GCC/Clang 默認包含在 -Wall 中) 自動檢測格式字符串錯誤。