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

C語言標準 I/O 核心:printf 與 scanf 格式化輸入輸出完全指南

     編輯:關於C語言

前言:格式化 I/O 的雙子星

printf 與 scanf 是 C 語言最常用、功能最豐富的 I/O 函數。掌握格式字串語法、轉換規格、對應參數規則,是避免「格式化字串漏洞」與輸出錯誤的關鍵。

一、printf 格式化輸出

調用格式


int printf(const char *format, ...);
// 返回輸出字元數,錯誤返回負值

格式字串結構

format = 普通字元 (原樣輸出) + 轉換規格 (以 % 開頭)

轉換規格完整語法


%[旗標][寬度][.精度][長度]類型

常用類型字元對照表

類型對應參數輸出形式
d, iint有號十進制整數
uunsigned int無號十進制整數
ounsigned int八進制 (不帶前綴)
x, Xunsigned int十六進制 (小寫/大寫)
f, Fdouble定點小數
e, Edouble科學記號
g, Gdouble自動選擇 f 或 e (短者)
cint (字元)單一字元
schar*字串 (至 '\0')
pvoid*指標位址 (實作定義格式)
%無輸出 '%'

旗標、寬度、精度、長度修飾

類別選項效果
旗標-左對齊 (預設右對齊)
+有號數值強制顯示正負號
(空格)正數前加空格,負數加負號
#替代形式: 0x/0X/0 前綴, 強制小數點
0左側填充 0 (而非空格),旗標 - 覆蓋
寬度n 或 *最小欄寬,* 從參數取得
精度.n 或 .*浮點數小數位數 / 字串最大字元數 / 整數最小位數
長度hhchar (提升為 int)
hshort
l (ell)long / double (針對 f 等) / wchar_t*
lllong long
Llong double

實用範例


printf("%-10s %5d %8.2f\n", "Apple", 100, 12.5);   // 左對齊字串、寬度5整數、寬度8保留2位小數
printf("0x%08X\n", 0x123ABC);                     // 8位十六進制前導0、大寫
printf("%p\n", (void*)&var);                      // 列印位址

二、scanf 格式化輸入

調用格式


int scanf(const char *format, ...);
// 返回成功轉換賦值的參數個數,EOF 表示輸入失敗/結束

核心差異:scanf 參數必須是位址


int a; float b; char c; char str[20];
scanf("%d %f %c %19s", &a, &b, &c, str);  // str 已是位址

掃描集合 %[...] 進階用法


char line[100];
scanf("%[^\n]", line);      // 讀取整行 (不含 \n)
scanf("%[abc]", set);       // 僅讀取 a/b/c 字元
scanf("%[^abc]", set);      // 讀取非 a/b/c 字元

常見陷阱與修正

陷阱錯誤代碼問題修正
忘記 &scanf("%d", a)傳值而非位址,導致亂寫記憶體&a
%s 無寬度限制scanf("%s", str)緩衝區溢位風險%19s (陣列大小-1)
殘留 \n 干擾後續讀取scanf("%d", &n); gets(s)gets 讀到空行中間加 getchar() 吃掉 \n,或改用 fgets
格式字串不匹配參數printf("%d", 1.5)未定義行為嚴格對應類型
忽略返回值不檢查 scanf 返回輸入失敗時變數未初始化if (scanf(...) != N) handle_error()

三、安全替代方案

  • snprintf/vsnprintf:指定緩衝區大小,防止溢位
  • fgets + sscanf:先安全讀行,再解析,分離 I/O 與解析邏輯
  • scanf_s (C11 Annex K / MSVC 擴展):強制寬度參數

結語

printf/scanf 功能強大但「格式字串與參數不匹配」是 C 語言第一大 Bug 來源。熟記「類型字元、旗標/寬度/精度/長度修飾、scanf 必須傳位址、%s 必須限寬度、檢查返回值」五大鐵律,並善用 snprintf/fgets+sscanf 替代不安全用法,能寫出既彈性又安全的格式化 I/O 代碼。

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