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

C 語言 printf 格式化輸出完全手冊:格式符、標志、寬度、精度、長度修飾符

     編輯:關於C語言

調用格式


int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *buf, const char *format, ...);
int snprintf(char *buf, size_t n, const char *format, ...); // 安全版

格式字符串解剖


%[flags][width][.precision][length]specifier

轉換說明符完整表

符號輸出類型對應參數類型示例
%d, %i有符號十進制整數int42, -7
%u無符號十進制整數unsigned int42
%o八進制 (無前綴)unsigned int52
%x, %X十六進制 (小寫/大寫)unsigned int2a, 2A
%f, %F定點小數double (float 升級)3.141593
%e, %E科學記數法 (e/E)double3.141593e+00
%g, %G自動選擇 %f/%e (短者勝出)double3.14159
%a, %A十六進制浮點數 (C99)double0x1.921fbp+1
%c單字元int (字元碼)A
%s字串const char*hello
%p指針地址void*0x7ffe...
%n不輸出,寫入已輸出字元數int*-
%%輸出字面 %-%

標志

標志含義示例
-左對齊 (默認右對齊)%-10s → "hello "
+有符號數總顯示符號%+d → +42, -7
(空格)正數前加空格,負數加 -% d → 42, -7
#替代形式:%#o 加 0, %#x 加 0x, %#f/%e/%g 強制保留小數點%#x → 0x2a
0右對齊時用 0 填充 (數值類型)%06d → 000042

寬度與精度

  • 寬度:最小輸出字元數,不足填充。%10d、%*d (參數指定)
  • 精度:
    • 整數:最小數字位數,不足前補 0 (%.4d → 0042)
    • 浮點:小數點後位數 (%.2f → 3.14)
    • 字串:最大字元數 (%.3s → hel)
  • 組合:%8.3f (寬 8,小數 3),%-10.2s (左對齊寬 10,最多 2 字元)

長度修飾符

修飾符含義適用類型
hhchar (1B)%hhd, %hhu
hshort (2B)%hd, %hu
llong (4/8B) / double (for %f)%ld, %lf
lllong long (8B)%lld, %llu, %llx
Llong double%Lf, %Le
jintmax_t / uintmax_t%jd, %ju
zsize_t%zu, %zd
tptrdiff_t%td, %tu

經典組合示例


// 對齊表格
printf("%-20s %10d %8.2f\n", "Apple", 100, 5.50);  // 左對齊字串,右對齊數字

// 十六進制轉儲
printf("0x%08X\n", 0x123ABC);  // 0x00123ABC

// 指針打印 (標準)
printf("%p\n", (void*)ptr);

// size_t 打印 (可移植)
printf("Size: %zu bytes\n", sizeof(arr));

// int64_t 打印 (C99 )
#include 
printf("Big: %" PRId64 "\n", big_num);

安全與最佳實踐

  1. 嚴禁格式字串漏洞:printf(user_input) → printf("%s", user_input)
  2. 優先用 snprintf:防緩衝區溢出
  3. 參數類型嚴格匹配:啟用 -Wformat -Wformat-security 編譯器檢查
  4. %lf 在 printf 中等同 %f (C99 允許),但 scanf 必須用 %lf 讀 double
  5. %p 必須轉換為 void*:printf("%p", (void*)ptr)

總結

printf 格式化字串是聲明式輸出規範,掌握「標志-寬度-精度-長度-類型」五段式語法,能精確控制任何輸出格式。現代代碼應配合 使用定寬整數宏 (PRId32, PRIu64...) 確保跨平台可移植,並堅持 snprintf 防溢出。

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