printf 是 C 語言最常用的輸出函數,其格式字串擁有豐富的控制能力。本文系統梳理格式佔位符完整語法,涵蓋基礎類型、寬度、精度、對齊、填充、進制、長整數等實戰場景。
%[標誌][寬度][.精度][長度]類型
-左對齊、+顯示正負號、0零填充、空格正數前置空格、#替代形式.數字,浮點數小數位數、字串最大字元數、整數最小位數hh/h/l/ll/j/z/t/L 對應 char/short/int/long/long long/intmax_t/size_t/ptrdiff_t/long doubleint a = 10;
float f = 1.1f;
double d = 2.2;
char c = 'a';
char *s = "string";
printf("int: %d\n", a); // 10
printf("float: %f\n", f); // 1.100000
printf("double: %f\n", d); // 2.200000
printf("char: %c\n", c); // a
printf("string: %s\n", s); // string
printf("octal: %o\n", a); // 12 (八進制)
printf("hex: %x\n", a); // a (十六進制小寫)
printf("HEX: %X\n", a); // A (十六進制大寫)
int a = 1, b = 222;
printf("%10d %10d\n", a, b); // 右對齊(預設)
printf("%-10d %-10d\n", a, b); // 左對齊
printf("%010d %010d\n", a, b); // 零填充右對齊
輸出:
1 222
1 222
0000000001 0000000222
double pi = 3.1415926535;
printf("%.2f\n", pi); // 3.14
printf("%.5f\n", pi); // 3.14159
printf("%10.3f\n", pi); // 寬度 10、精度 3 → " 3.142"
long long big = 123456789012345LL;
printf("%lld\n", big); // 長長整數
printf("%zd\n", sizeof(int)); // size_t
printf("%td\n", ptrdiff); // ptrdiff_t
printf("%p\n", (void*)&big); // 指針地址
int x = 42;
printf("%#o\n", x); // 052 (# 強制八進制前綴 0)
printf("%#x\n", x); // 0x2a (# 強制十六進制前綴 0x)
printf("%#X\n", x); // 0X2A
float f = 10.01f;
printf("%+f\n", f); // +10.010000 (顯式正號)
printf("%+.0f\n", f); // +10 (無小數位、顯式正號)
| 陷阱 | 說明 | 對策 |
|---|---|---|
| 格式與引數類型不匹配 | 未定義行為,如 %d 對應 float | 啟用 -Wformat 警告,嚴格匹配 |
%s 無長度限制 | 緩衝區溢出風險 | 用 %.maxs 或 snprintf |
| 長度修飾符遺漏 | long long 用 %d 截斷 | 務必加 ll:%lld |
字串非以 \0 結尾 | %s 讀越界 | 確保字串合法或用精度限制 |
snprintf(buf, size, fmt, ...):防溢位格式化到緩衝區fprintf(stderr, ...):錯誤輸出導向標準錯誤流asprintf (GNU 擴展):自動分配記憶體熟練掌握 printf 格式控制,不僅能產出整齊可讀的日誌/報表,更能在除錯時精準觀測程式狀態。建議收藏語法速查表,實戰中隨查隨用。