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

C語言格式說明符完整速查表

     編輯:關於C語言

前言

格式說明符是 C 語言輸入輸出函數 (printf, scanf 等) 的核心,掌握其完整語法能避免大量難以除錯的格式化錯誤。本文提供標準 C (C99/C11) 完整規範速查表。

基本語法

%[旗標][寬度][.精度][長度]類型
  • 所有欄位均為選填,% 與 類型 為必填
  • 順序固定:旗標 → 寬度 → 精度 → 長度 → 類型

類型說明符

類型對應資料型態printf 輸出scanf 輸入
d, iint有號十進位整數有號十進位 (i 可自動識別 0x/0 開頭)
uunsigned int無號十進位整數無號十進位
ounsigned int無號八進位 (無前綴)無號八進位
x, Xunsigned int無號十六進位 (小寫/大寫)無號十六進位
f, Fdouble定點小數 (小寫/大寫 nan/inf)浮點數
e, Edouble科學記號 (小寫/大寫 e)浮點數
g, Gdouble自動選 f 或 e (短者),去尾隨 0浮點數
a, Adouble十六進位浮點數 (C99)浮點數 (C99)
cint (字元)單一字元單一字元 (不跳過空白)
schar*字串 (至空字元)字串 (跳過前導空白,讀至空白)
pvoid*指標位址 (實作定義格式)指標位址
nint*不輸出,寫入目前已輸出字元數不讀取,寫入已讀取字元數
%無輸出 % 字元匹配輸入 %

旗標

旗標說明適用類型
-左對齊 (預設右對齊)所有
+有號數值必顯示正負號d,i,f,e,E,g,G
空格正數前加空格,負數加負號d,i,f,e,E,g,G
#替代形式:o 加 0 前綴,x/X 加 0x/0X,f/e/g 強制顯示小數點,g/G 保留尾隨 0o,x,X,f,e,E,g,G
0左側補 0 而非空格 (遇 - 旗標或精度時失效)d,i,o,u,x,X,f,e,E,g,G
'依區域設定加千分位分隔符 (C99, GNU 擴展)d,i,u,f,F,g,G

寬度與精度

  • 寬度:最小輸出字元數。不足時左/右填充。可用 * 從參數讀取 (printf("%*d", width, val))
  • 精度:. 後接數字或 *
    • d,i,o,u,x,X:最小位數,不足前補 0
    • f,F,e,E:小數點後位數 (預設 6)
    • g,G:最大有效數字總數
    • s:最大輸出字元數 (截斷)

長度修飾符

修飾符對應型態 (printf)對應型態 (scanf)
hhsigned char / unsigned charsigned char* / unsigned char*
hshort / unsigned shortshort* / unsigned short*
l (ell)long / unsigned long / double (同無修飾)long* / unsigned long* / double*
ll (ell ell)long long / unsigned long longlong long* / unsigned long long*
jintmax_t / uintmax_tintmax_t* / uintmax_t*
zsize_t / ssize_tsize_t*
tptrdiff_tptrdiff_t*
Llong doublelong double*

常見組合範例

printf("%05d\n", 42);       // 00042 (寬度5, 補0)
printf("%-10s\n", "hi");    // "hi        " (左對齊)
printf("%+d %+d\n", 1, -1); // "+1 -1" (強制符號)
printf("%#x\n", 255);       // "0xff" (替代形式)
printf("%.2f\n", 3.14159);  // "3.14" (精度2)
printf("%.*f\n", 3, 1.2);   // "1.200" (精度來自參數)
printf("%lld\n", 1LL<<60);  // long long 輸出
scanf("%zu", &size_var);    // 讀取 size_t

scanf 專用細節

  • %[...] 掃描集:%[abc] 只讀 a/b/c,%[^abc] 讀非 a/b/c,%[^\n] 讀整行
  • %*d 抑制賦值:讀取但不存入變數
  • %n 獲取已讀字元數:scanf("%d%n", &val, &cnt)
  • 所有指標參數必須匹配長度修飾符,否則未定義行為

避坑指南

  1. 浮點數 printf 統用 %f:float 會自動提升為 double,%lf 在 printf 中合法但多餘 (C99 允許),scanf 必須 用 %lf 讀 double
  2. 字串輸入防溢位:scanf("%19s", buf) 限制寬度 (buf[20])
  3. 字元輸入吃掉換行:scanf(" %c", &ch) 前加空格跳過空白字元
  4. 指標格式:printf("%p", (void*)ptr) 強制轉 void* 避免警告
  5. 長度修飾符不匹配:long long 用 %lld,size_t 用 %zu,int64_t 用 PRId64 (inttypes.h)

C99/C11 新增宏 (inttypes.h)

為了跨平台可移植性,定長整數型態應使用宏:

printf("int32_t: %" PRId32 "\n", val32);
printf("uint64_t: %" PRIu64 "\n", val64);
scanf("%" SCNd32, &val32);

總結

格式說明符看似瑣碎,實則是 C 語言 I/O 正確性的基石。建議:

  1. 常用組合 (%d, %s, %.2f, %p) 熟記於心
  2. 複雜格式查表組合,注意順序:旗標→寬度→精度→長度→類型
  3. scanf 比 printf 更危險,務必檢查回傳值 (成功轉換數) 並防緩衝區溢位
  4. 跨平台代碼務必用 inttypes.h 宏

將此表存為備忘單,下次遇到格式化輸出怪異行為時,對照檢查即可快速定位問題。

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