首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C 語言 printf() 函數完整指南:格式字串、轉換說明符、修飾符與實戰技巧

     編輯:C 語言入門

函數原型與參數結構

int printf(const char *format, ...);
// 回傳:輸出字元數,錯誤回負值
// 參數:控制字串 + 可變參數列表

控制字串組成

  • 普通字元:原樣輸出
  • 轉義序列:\n 換行、\t 定位、\\ 反斜線等
  • 轉換說明符:% 開頭,指定參數輸出格式

轉換說明符完整對照表

說明符輸出型別範例輸出備註
%d, %i有號十進位整數42, -7同義
%u無號十進位整數4294967295-1 輸出為 MAX_UINT
%o八進位無號整數1750
%x, %X十六進位無號整數7b, 7B小寫/大寫字母
%f十進位浮點數3.141593預設小數 6 位
%e, %E科學記號浮點數3.141593e+00指數小寫/大寫
%g, %G自動選擇 %f/%e3.14 / 1.23e+06有效數字 6 位,去尾零
%a, %A十六進位浮點數 (C99)0x1.921fb5p+1精確二進位表示
%c單一字元Aint 引數轉 unsigned char
%s字串hellochar* 以 \0 結尾
%p指標位址0x7ffeefbff5a0void* 參數,實作定義格式
%%字面 % 字元%輸出百分號本身

修飾符完整指南

位置:%[旗標][寬度][.精度][長度]說明符

旗標

旗標效果範例
-左對齊 (預設右對齊)%-10d → "42 "
+強制顯示正負號%+d → "+42"
空格正數前加空格,負數顯示 -% d → " 42"
0前導零填充 (數值型)%05d → "00042"
#替代形式%#x→"0x2a", %#o→"052", %#f→強制小數點

寬度與精度

語法意義適用說明符範例
%10d最小欄寬 10,不足左補空格所有" 42"
%.3f小數點後 3 位f, e, E3.142
%.5s最多輸出 5 字元s"hello" → "hello"
%.3d最少 3 位數字,前導零d, i, o, u, x, X7 → "007"
%10.3f欄寬 10,小數 3 位f, e, E" 3.142"
%.*f精度由引數指定f, e, Eprintf("%.*f", 3, 3.14159)

長度修飾符

修飾符對應型別範例
hhsigned char, unsigned char%hhd, %hhu
hshort, unsigned short%hd, %hu
(無)int, unsigned int%d, %u
llong, unsigned long%ld, %lu
lllong long, unsigned long long%lld, %llu
Llong double%Lf, %Le
zsize_t (sizeof 回傳)%zu, %zd
tptrdiff_t (指標差值)%td, %tu
jintmax_t, uintmax_t%jd, %ju

實戰技巧與陷阱

1. 參數對應嚴格性

printf("%d %s", 42);        // 錯誤:少參數 → 未定義行為
printf("%d", "hello");      // 錯誤:型別不符 → 型別懲罰
printf("%s", 42);           // 嚴重:解讀 42 為位址 → Crash

2. 寬度/精度由引數傳遞

printf("%*d", 10, 42);      // 寬度 10 → "        42"
printf("%.*s", 3, "hello"); // 精度 3 → "hel"

3. 字串輸出安全

char *p = NULL;
printf("%s", p); // Crash!
printf("%s", p ? p : "(null)"); // 安全寫法

4. 結構體輸出除錯巨集

#define PRINT_POINT(p) printf("Point(%d, %d)", (p).x, (p).y)
#define PRINT_RECT(r) printf("Rect[%d,%d %dx%d]", (r).x, (r).y, (r).w, (r).h)

5. 回傳值利用

int len = printf("Hello"); // len = 5
printf(" (%d chars)\n", len);

安全替代方案

  • snprintf(buf, size, fmt, ...):緩衝區長度限制,防溢位
  • vsnprintf:配合 va_list 實作自訂日誌函數
  • asprintf (GNU 擴充):自動配置記憶體

結語

printf 以極簡介面實現極致格式化輸出能力。精通轉換說明符、修飾符組合、長度修飾符對應型別三大核心知識體系,並養成參數嚴格對應、使用 snprintf 防溢位、善用回傳值的工程習慣,即能在除錯、日誌、報表、序列化等場景遊刃有餘。記住:格式字串即程式,編譯器無法完全驗證,測試與 Code Review 是最後防線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved