printf("格式控制字符串", 輸出項列表);
格式字符串由普通字符(原樣輸出)和格式說明符(以 % 開頭)組成。
| 符號 | 含義 | 示例輸出 |
|---|---|---|
%d, %i | 有符號十進制整數 | 88, -12 |
%ld | 長整型 (long) | 1234567890L |
%lld | 長長整型 (long long) | 9223372036854775807 |
%u | 無符號十進制整數 | 4294967295 |
%o | 八進制 (無前綴 0) | 17 |
%x, %X | 十六進制 (無前綴 0x,小寫/大寫) | ff, FF |
%f | 單/雙精度小數 (預設 6 位小數) | 123.456000 |
%e, %E | 科學計數法 (小寫/大寫 e) | 1.234560e+02 |
%g, %G | 自動選 %f 或 %e 中較短者 | 123.456 |
%c | 單一字符 | A |
%s | 字符串 (以 \0 結尾) | Hello |
%p | 指標地址 (十六進制) | 0x7ffeefbff5a0 |
%% | 輸出字面 % 符號 | % |
| 旗標 | 作用 |
|---|---|
- | 左對齊 (預設右對齊) |
+ | 強制顯示正負號 |
空格 | 正數前加空格,負數顯示負號 |
# | 替代形式:%#o 加 0 前綴,%#x 加 0x,%#f/%#e/%#g 強制顯示小數點 |
0 | 右對齊時用 0 填充 (而非空格) |
%[旗標][寬度][.精度][長度]類型
// 示例
%10d // 最寬 10 字符,右對齊
%-10d // 最寬 10 字符,左對齊
%05d // 寬 5,前導補 0
%5.2f // 總寬 5,小數 2 位
%.3s // 最多取字符串前 3 字符
%*d // 寬度由參數指定 (int width, int val)
%.*f // 精度由參數指定 (int prec, double val)
| 修飾符 | 對應類型 |
|---|---|
hh | signed char, unsigned char |
h | short, unsigned short |
l | long, unsigned long, double (在 %f 中) |
ll | long long, unsigned long long |
L | long double |
z | size_t (C99) |
t | ptrdiff_t (C99) |
j | intmax_t (C99) |
int a = 15; char d = 'p';
float b = 123.1234567f;
double c = 12345678.1234567;
printf("a=%d, %5d, %o, %x\n", a, a, a, a);
// a=15, 15, 17, f
printf("b=%f, %lf, %5.4lf, %e\n", b, b, b, b);
// b=123.123457, 123.123457, 123.1235, 1.231235e+02
printf("d=%c, %8c\n", d, d);
// d=p, p
printf("c=%lf, %f, %8.4lf\n", c, c, c);
// c=12345678.123457, 12345678.123457, 12345678.1235
float → double,%lf 在 printf 中等同 %f (但在 scanf 中必須用 %lf 讀 double)。%s 需確保字符串以 \0 結尾,否則越界讀取。snprintf 限制長度。利用 vprintf/vsnprintf 封裝日誌庫:
void Log(const char* fmt, ...) {
va_list ap; va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
掌握 printf 格式字符串,關鍵在於熟記類型對應、靈活運用旗標/寬度/精度、理解長度修飾符。建議將速查表存為備忘,實戰中多嘗試 %04d、%-10s、%.*f 等組合,自然得心應手。