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

printf 與 scanf 格式控制字符串、轉換說明符及修飾符完整速查表

     編輯:關於C語言

C 語言標準輸入輸出的核心在於格式字符串,掌握轉換說明符(%d、%f…)、長度修飾符(h、l、ll、L、z、t、j)及標志修飾符(-、+、0、#、空格、寬度、精度)是寫出健壯代碼的基礎。本文整理最新 C11/C18 標準對應表,並釐清 printf/%lf、scanf/%lf 等易混淆點。

一、printf 族函數

1. 基礎轉換說明符

符號對應類型輸出格式
d, iint有符號十進制
uunsigned int無符號十進制
ounsigned int八進制
x, Xunsigned int十六進制 (小寫/大寫)
f, Fdouble定點小數
e, Edouble科學計數法
g, Gdouble自動選擇 %f/%e
a, A (C99)double十六進制浮點數
cint (字符)單字符
schar *字符串
pvoid *指針地址
nint *寫入已輸出字符數
%—字面 '%'

2. 長度修飾符(鍵盤順序:h → 無 → l → ll → L → z → t → j)

修飾符對應類型 (printf)備註
hhsigned char / unsigned charC99
hshort / unsigned short
(無)int / unsigned int / doublefloat 會自動提升為 double
llong / unsigned long / wchar_t*%ls 輸出寬字符串
lllong long / unsigned long longC99
Llong double%Lf, %Le, %La
zsize_t / ssize_tC99,%zu
tptrdiff_tC99,%td
jintmax_t / uintmax_tC99,%jd

3. 關鍵區別:printf 中 %f 統一處理 float/double

因默認參數提升規則,float 傳入可變參數函數時自動提升為 double,故 printf **無 %lf**,%f 兼容兩者;long double 必須用 %Lf。但 scanf 需區分:%f→float*、%lf→double*、%Lf→long double*。

二、scanf 族函數

轉換說明符與 printf 大體對應,但 無 %g/%a/%n 等輸出專用符,且 所有指針參數必須精確匹配長度修飾符(見上表)。常見錯誤:scanf("%d", &longVar) 應為 %ld。

三、* 修飾符(賦值抑制/寬度/精度動態指定)

  • %*d:讀取一個 int 但**不賦值**,跳過該輸入項。
  • printf("%*d", width, val):寬度由參數 width 動態指定。
  • printf("%.*f", prec, val):精度由參數 prec 動態指定。
  • printf("%*.*f", width, prec, val):寬度、精度均動態。

四、最佳實踐清單

  1. 編譯時加 -Wformat=2 -Wformat-overflow 捕獲不匹配。
  2. 優先使用 inttypes.h 宏(PRId64、PRIuPTR…)保證跨平台一致性。
  3. scanf 返回值**必須檢查**,防止輸入失敗導致變量未初始化。
  4. 字符串輸入用 %*s 限制寬度或改用 fgets 避免緩衝區溢出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved