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

C語言 scanf 輸入數組單個字符被跳過?緩衝區殘留換行符導致

     編輯:程式設計綜合問答

現象重現

使用 scanf("%c", &c[0]) 讀取單個字符時,程序直接跳過輸入,不等待用戶操作。典型代碼如下:

scanf("%s", b);  // 讀取字符串
scanf("%c", &c[0]); // 本意讀取單字符,實際跳過

根本原因

scanf("%s") 讀取字符串時,遇空格、換行、製表符結束,但將結束符(如換行符 '\n')留在標準輸入緩衝區。隨後的 %c 直接讀取該殘留換行符,導致看似「跳過輸入」。

解決方案

方法一:在格式字符串前加空格(推薦)

scanf(" %c", &c[0]); // %c 前的空格會自動跳過所有空白字符

方法二:顯式清空緩衝區

// Windows (MSVC)
fflush(stdin); // 非標準,但 MSVC 支援

// 跨平台標準做法:讀取並丟棄至換行符
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

方法三:改用 fgets + sscanf

整行讀取後再解析,完全避開緩衝區殘留問題:

char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%c", &c[0]);

最佳實踐建議

  • 混用 %s 和 %c 時,務必在 %c 前加空格。
  • 避免使用非標準的 fflush(stdin),移植性差。
  • 關鍵輸入流程建議統一使用 fgets 讀行,再用 sscanf 解析,健壯性最強。

總結

scanf 留下的換行符是導致 %c 跳過輸入的元兇。在格式符前加空格 " %c" 是最簡潔、標準的修復方式。

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