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

C 語言 printf 格式化輸出完全指南:轉換符、標志、寬度、精度、長度

     編輯:關於C語言

轉換說明符速查

符號輸出類型示例備註
%d, %i有符號十進制整數42, -7
%u無符號十進制整數42
%o八進制052無前綴
%x, %X十六進制2a, 2A無前綴
%f定點浮點數3.140000默認 6 位小數
%e, %E科學計數法3.140000e+00
%g, %G自動選 f/e,去尾零3.14精度為有效數字
%a, %A十六進制浮點數0x1.91eb851eb851fp+1C99
%c單字符A
%s字符串hello以 \0 結束
%p指針地址0x7ffe...實現定義格式
%%字面 %%

標志字符

標志含義示例
-左對齊(默認右對齊)%-10d
+有符號數總顯示正負號%+d → +42
空格正數前加空格,負數顯示 -% d → 42
#替代形式:o 加 0,x/X 加 0x/0X,f/e/g 強制顯示小數點%#x → 0x2a
0寬度填充用 0 而非空格(數值類型)%05d → 00042

完整格式語法

%[標志][最小寬度][.精度][長度]轉換符

最小寬度

  • %10d:至少佔 10 列,不足左填空格(或 0)。
  • %*d:寬度由參數指定 printf("%*d", 10, 42)。

精度

  • 整數(d,i,o,u,x,X):最小數字位數,不足前補 0。
  • 浮點數(f,F,e,E):小數點後位數。
  • 字符串(s):最大字符數(截斷)。
  • %.*s:精度由參數指定。

長度修飾符

修飾符對應類型示例
hhsigned char, unsigned char%hhd
hshort, unsigned short%hd
llong, unsigned long, double(%lf 等同 %f)%ld, %lf
lllong long, unsigned long long%lld
jintmax_t, uintmax_t%jd
zsize_t%zu
tptrdiff_t%td
Llong double%Lf

實戰示例

printf("%-10s %08x %+06.2f\n", "Item", 0x2A, 3.14);
// 輸出: Item       0000002a +03.14

printf("Pointer: %p\n", (void*)0xdeadbeef);
// 輸出: Pointer: 0xdeadbeef

printf("%.2s\n", "Hello");      // He
printf("%5.2s\n", "Hello");    //    He
printf("%-5.2s\n", "Hello");   // He   

printf("%#x %#o\n", 42, 42);   // 0x2a 052

常見坑與避坑指南

  1. 參數類型不匹配:%d 對應 long 會導致未定義行為。使用 %ld 或強轉。
  2. %s 無 \0 結束:會越界讀取。用 %.ns 限制長度或確保字符串結尾。
  3. 浮點數傳遞:float 會自動提升為 double,%f、%lf 在 printf 中等價;但 scanf 中必須用 %lf 讀 double。
  4. 指針打印:務必轉 (void*) 配合 %p,否則行為未定義。
  5. 長度修飾符缺失:64 位系統 long 可能 8 字節,%d 只取低 4 字節。養成用 %ld/%zu/%td 習慣。

進階:自定義輸出

C99 <inttypes.h> 提供 PRId64、PRIuPTR 等宏,確保跨平台格式化正確:

#include <inttypes.h>
int64_t x = 1234567890123LL;
printf("x = %" PRId64 "\n", x);

總結

掌握 printf 格式化字符串,能精確控制輸出佈局、避免類型不匹配 Bug、提升日誌可讀性。建議收藏本表,編寫格式化代碼時隨時查閱。

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