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

C語言格式化輸入輸出全族譜:printf/scanf/fprintf/fscanf/sprintf/sscanf 詳細對比

     編輯:關於C語言

六大格式化 I/O 函數族覆蓋**標準流、文件流、字符串緩衝區**三大目標。本文統一梳理函數原型、格式字符串語法、返回值語義、安全陷阱與典型用法。

函數族速查總表

目標輸出輸入
標準流 (stdout/stdin)printfscanf
文件流 (FILE*)fprintffscanf
字符串緩衝區 (char*)sprintf / snprintfsscanf

一、格式字符串通用語法

%[flags][width][.precision][length]type
  • flags: -左對齊 +正負號 空格正數前空格 #前綴(0x/0) 0填零
  • width: 最小寬度,* 從參數獲取
  • precision: 小數位數/字符串最大長度/有效位數,* 從參數獲取
  • length: hh/h/l/ll/j/z/t/L 對應 char/short/long/long long/intmax_t/size_t/ptrdiff_t/long double

二、輸出類型完整表

三、輸入類型完整表

type參數類型輸出形式
d/iint有符號十進制
uunsigned無符號十進制
ounsigned八進制
x/Xunsigned十六進制 (小寫/大寫)
f/Fdouble定點小數 (預設 6 位)
e/Edouble科學計數法 (小寫/大寫 e)
g/Gdouble自動選 f/e (短者),去尾部 0
a/Adouble十六進制浮點 (C99)
cint單字符 (轉 unsigned char)
schar*字符串 (至 \0)
pvoid*指針地址 (十六進制)
nint***不輸出**,寫入已輸出字符數
%無字面 %
type參數類型讀取行為
dint*有符號十進制
iint*自動識別 0x/0 進制
uunsigned*無符號十進制
o/x/Xunsigned*八/十六進制
f/e/gfloat*浮點數 (同義)
lf/le/lgdouble*雙精度浮點
schar*跳過空白,讀至空白 (危險!無長度限制)
cchar*單字符 (含空白),%1c 讀 1 字符
[...]char*掃描集:僅讀集合內字符,如 %[a-z]
[^...]char*排除掃描集:讀非集合字符,如 %[^\n] 讀整行
nint*寫入已讀字符數
* (抑制)無讀取但**不賦值**,如 %*d 跳過一個整數

四、六大函數詳細對比

1. printf / fprintf / sprintf / snprintf

  • 返回值: 成功返回**輸出字符數** (不含 \0);snprintf 返回**本應輸出的總字符數** (可檢測截斷)
  • sprintf 危險: 無長度限制 → 緩衝區溢出,**必須用 snprintf(buf, n, fmt, ...)**
  • fprintf: 同 printf 但目標為 FILE*,返回寫入字符數或 EOF

2. scanf / fscanf / sscanf

  • 返回值: 成功返回**賦值項數**;失敗/輸入盡返回 EOF
  • scanf 致命缺陷: %s 無長度限制,**絕不直接用於不可信輸入**
  • sscanf 安全: 源字符串固定,無溢出風險,適合解析協議/配置
  • 掃描集讀整行: sscanf(line, "%[^\n]", buf) 或 fgets 更簡潔

五、經典陷阱與避坑

  1. scanf("%s", buf) → fgets(buf, n, stdin) + sscanf / 手動解析
  2. sprintf(buf, "%s", src) → snprintf(buf, sizeof(buf), "%s", src)
  3. 格式字符串漏洞:printf(user_input) → printf("%s", user_input)
  4. %n 利用寫入任意地址 → 禁用或極度謹慎
  5. 浮點 float 傳給 %f 自動提升為 double,但 scanf 必須用 %lf 讀 double
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved