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

C 語言 printf 格式化輸出完全手冊:格式字符、標志、寬度精度與進階技巧

     編輯:關於C語言

格式控制字符串完整語法

% [標志] [寬度] [.精度] [長度修飾符] 類型字符

各組成部分詳解

1. 標志字符

標志含義
-左對齊(默認右對齊)
+有符號數總顯示正負號
空格正數前加空格,負數顯示 -
0數值右對齊時左側填 0(而非空格)
#替代形式:八進制加 0,十六進制加 0x,浮點數強制顯示小數點

2. 寬度與精度

  • m:最小字段寬度,不足左填(或右填 -),超寬不截斷
  • .n:精度。整數→最小位數(左補 0);浮點→小數位數;字符串→最大字符數
  • *:由參數動態指定寬度/精度,如 printf("%*.*s", w, p, str)

3. 長度修飾符

修飾符適用類型含義
hhd,i,o,u,x,Xsigned/unsigned char
hd,i,o,u,x,Xshort/int
ld,i,o,u,x,Xlong
lf,F,e,E,g,Gdouble(printf 中 %lf 同 %f)
lld,i,o,u,x,Xlong long
Lf,F,e,E,g,Glong double
zd,i,o,u,x,Xsize_t
td,i,o,u,x,Xptrdiff_t
jd,i,o,u,x,Xintmax_t

4. 類型字符速查表

字符輸出內容示例
d,i有符號十進制整數42, -7
u無符號十進制42
o八進制52
x,X十六進制2a, 2A
c字符A
s字符串hello
f,F定點小數3.141593
e,E科學計數法3.141593e+00
g,G自動選 f/e 短者,去尾部 03.14159
p指針地址0x7ffe...
n已輸出字符數寫入 int*(隱蔽)
%字面 %%

字符串格式化進階

%-10.5s   // 左對齊,寬 10,最多取 5 字符
%10.5s    // 右對齊,寬 10,最多取 5 字符
%*.*s     // 寬度、精度由參數傳入

實戰範例

printf("%f%%\n", 1.0/3);        // 0.333333%
printf("%d, %o\n", -1, -1);     // -1, 177777(補碼八進制)
printf("%x\n", 255);            // ff
printf("%#x\n", 255);           // 0xff
printf("%05d\n", 7);            // 00007
printf("%-10s|\n", "hi");       // "hi        |"

安全與避坑

  1. %n 漏洞:格式化字符串攻擊利用點,現代編譯器默認禁用或需 %n$ 顯式啟用
  2. 參數不匹配:導致未定義行為,啟用編譯器警告 -Wformat
  3. 緩衝區溢出:sprintf 改用 snprintf
  4. 浮點精度:float 僅 6~7 位有效數字,double 15~16 位,勿過度依賴默認 6 位小數

動態寬度精度技巧

int w = 10, p = 3;
printf("%*.*f\n", w, p, 3.14159);  // 寬 10,精度 3 → "    3.142"

總結

掌握 printf 格式字符串的完整語法,能精確控制輸出樣式,避免常見 Bug。現代 C++ 推薦使用 iostream 或 fmt 庫(類型安全、可擴展),但 printf 仍是嵌入式、系統編程、跨語言調用的標準選擇。

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