C語言 printf 格式化輸出完全手冊:轉換符、標誌、寬度、精度
printf 是 C 語言最常用也最強大的輸出函數。掌握其完整格式語法,能讓輸出對齊美觀、數值精確、調試高效。
一、完整格式語法
%[標誌][寬度][.精度][長度]轉換符
二、轉換符速查表
| 符號 | 含義 | 示例輸出 |
| %d, %i | 有符號十進制整數 | 42, -7 |
| %u | 無符號十進制整數 | 42 |
| %o | 八進制整數 | 52 |
| %x, %X | 十六進制整數 | 2a, 2A |
| %f, %F | 十進制浮點數 | 3.141593 |
| %e, %E | 科學計數法 | 3.141593e+00 |
| %g, %G | %f/%e 自動選短者,去尾隨0 | 3.14159 |
| %a, %A | 十六進制浮點數 (C99) | 0x1.921fb5p+1 |
| %c | 單字符 | A |
| %s | 字符串 | hello |
| %p | 指針地址 | 0x7ffe... |
| %n | 已輸出字符數寫入指針 | (無輸出) |
| %% | 輸出字面 % | % |
三、標誌字符
| 標誌 | 含義 | 示例 |
| - | 左對齊(默認右對齊) | %-10d → "42 " |
| + | 總顯示符號 | %+d → "+42", "-7" |
| 空格 | 正數前加空格,負數加- | % d → " 42", "-7" |
| 0 | 寬度填充用0而非空格 | %05d → "00042" |
| # | 替代形式:0x/0X/0/.000 | %#x → "0x2a", %#f → "3.140000" |
四、寬度與精度
- 寬度 (m):最小輸出字符數,不足填充,超出不截斷
- 精度 (.n):
- 整數:最小位數,不足前補0
- 浮點數:小數點後位數(%f)或有效數字(%g/%e)
- 字符串:最大字符數,超出截斷
- 可用
* 從參數動態獲取:printf("%*.*s", width, prec, str)
五、長度修飾符
| 修飾符 | 適用類型 | 示例 |
| hh | char (signed/unsigned) | %hhd |
| h | short | %hd |
| l | long, double | %ld, %lf |
| ll | long long | %lld, %llu |
| L | long double | %Lf |
| z | size_t | %zu |
| t | ptrdiff_t | %td |
| j | intmax_t/uintmax_t | %jd |
六、實戰示例
int a = 16;
float b = 79.3f;
printf("[%4d]\n", a); // [ 16] 右對齊寬度4
printf("[%-4d]\n", a); // [16 ] 左對齊
printf("[%10f]\n", b); // [ 79.300000] 寬度10
printf("[%.2f]\n", b); // [79.30] 保留2位小數
printf("[%4.2f]\n", b); // [79.30] 寬度4(不足不填)
printf("[%08.2f]\n", b); // [00079.30] 0填充寬度8
// 輸出字面 %
printf("Progress: %d%%\n", 100); // Progress: 100%
// %n 獲取已輸出長度
int len;
printf("Hello%n World\n", &len); // len = 5
// 64位整數
long long big = 9223372036854775807LL;
printf("%lld\n", big); // 9223372036854775807
printf("%016llx\n", big); // 7fffffffffffffff
七、單精度 vs 雙精度輸出
float:%f 足夠(默認提升為 double),有效數字 ~7 位
double:%f 或 %lf(scanf 需 %lf),有效數字 ~15-16 位
long double:%Lf
八、常見錯誤與避坑
- 格式符與參數類型不匹配:未定義行為,嚴重時崩潰
- 字符串未以 \0 結尾:%s 會越界讀取
- 緩衝區溢出:
sprintf → 改用 snprintf
- %p 需 void* 參數:
printf("%p", (void*)ptr)
- %n 是安全隱患:格式化字符串漏洞利用點,輸入不可控時禁用
九、scanf 格式化輸入對應關係
| printf | scanf | 備註 |
| %d | %d | int* |
| %f | %f | float* |
| %lf | %lf | double* (printf 也可用 %f) |
| %s | %s | char* (跳過空白,遇空白停止) |
| %c | %c | char* (不跳過空白) |
| % | %[] | 掃描集合,如 %[^\n] 讀整行 |
十、總結
printf 格式字符串是一門「小語言」。熟練掌握 標誌/寬度/精度/長度/轉換符 五要素組合,能精確控制任何輸出格式。調試時善用 %p、%#x、%zd 等專業格式;生產代碼優先用 snprintf 保證安全。記住:格式符與參數類型必須嚴格匹配,這是 C 語言類型安全的最後一道防線。