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

C語言 scanf 格式化輸入深度解析與常見陷阱

     編輯:關於C語言

scanf 語法結構

scanf("格式化字符串", 地址表);

格式化字符串三類字符

  1. 格式說明符:如 %d %f %s 等,與 printf 基本一致
  2. 空白字符:跳過輸入中的任意多個空白字符(空格、換行、制表)
  3. 非空白字符:匹配並丟棄輸入中相同字符(如逗號、冒號)

地址表關鍵規則

⚠️ 必須傳遞變量地址(&變量名),而非變量值! 這與 printf 截然不同。

基本示例

int i, j;
scanf("%d, %d", &i, &j); // 讀整數,跳過逗號,再讀整數

特殊情況:字符串輸入

數組名/指針本身即地址,不加 &:

char *p, str[20];
scanf("%s", p);   // 正確
scanf("%s", str); // 正確

字段寬度限制

scanf("%10s", p); // 最多讀 10 字符,第 11 字符留給下次讀取

經典陷阱:連續字符輸入與緩衝區殘留

問題代碼

char c1, c2;
scanf("%c", &c1); // 輸入 'A' + 回車
scanf("%c", &c2); // c2 讀到 '\n'!

解決方案

scanf("%c", &c1);
fflush(stdin); // Turbo C 專用,清除輸入緩衝區
scanf("%c", &c2);

跨平台緩衝區清理

int ch;
while ((ch = getchar()) != '\n' && ch != EOF); // 標準做法

最佳實踐建議

  1. 檢查 scanf 返回值(成功賦值的項數),確保輸入有效
  2. 字符輸入優先用 fgets + sscanf 避免緩衝區問題
  3. 格式字符串中顯式處理分隔符(逗號、空格等)
  4. 避免混用 %c 與其他格式,除非精確控制緩衝區

scanf 功能強大但易誤用,理解其掃描機制與緩衝區行為是編寫健壯輸入代碼的關鍵。

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