首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 scanf 輸入緩衝區殘留字元導致後續讀取異常:%d 失敗後 %c 讀到換行符

     編輯:程式設計綜合問答

現象重現

scanf("%d", &x); // 輸入 "s\n" → 匹配失敗,'s' 和 '\n' 留在緩衝區
scanf("%d", &y); // 緩衝區首字元 's' 非數字,再次失敗
scanf("%c", &a); // 讀到 's'(或 '\n'),非預期

根本原因

  • %d 匹配失敗時不消耗任何輸入字元,緩衝區原封不動。
  • 後續 %d 仍面對相同非數字字元,持續失敗。
  • %c 會讀取緩衝區第一個字元(包含空白、換行),導致看似「跳過」輸入。

正確處理流程

int x, y;
char c;

// 讀整數,檢查回傳值
if (scanf("%d", &x) != 1) {
    // 清空緩衝區直到換行
    while (getchar() != '\n');
    // 可選:提示重新輸入
}

// 讀字元(跳過空白)
scanf(" %c", &c); // 格式字串前加空白,自動跳過 \n \t 空格

代碼二分析

scanf("%d", &x); // 輸入 "s 1"
scanf("%d", &y);
printf("%d%d", x, y); // x、y 未初始化且讀取失敗,印出亂碼

第一次 %d 失敗,x 保留垃圾值;第二次同理;1 從未被讀取。

最佳實務

  • 永遠檢查 scanf 回傳值(成功匹配項目數)。
  • 失敗後清空緩衝區:while (getchar() != '\n');
  • 讀字元用 " %c" 跳過空白,或改用 fgets 整行讀取再 sscanf 解析。
  • 變數定義即初始化:int x = 0, y = 0;

總結

scanf 匹配失敗不消耗輸入,導致後續讀取連環失敗。務必檢查回傳值、清空緩衝區、初始化變數,或改用 fgets+sscanf 更健壯的輸入模式。

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