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

C語言清空標準輸入緩衝區:三種方案對比與推薦最佳實踐

     編輯:關於C語言

C語言清空標準輸入緩衝區:三種方案對比與推薦最佳實踐

場景:scanf("%d") 後緩衝區殘留 \n,導致後續 scanf("%c") 直接讀到換行符。

方案 1:fflush(stdin) ❌ 不推薦

fflush(stdin); // C標準未定義行為,僅MSVC支持,不可移植

方案 2:scanf("%*[^\n]") ❌ 脆弱

scanf("%*[^\n]"); // 讀取並丟棄直到換行,但若緩衝區為空會陷入等待,易失效

方案 3:setbuf(stdin, NULL) ⚠️ 副作用大

setbuf(stdin, NULL); // 將stdin設為無緩衝,影響後續所有輸入性能,不建議常規使用

方案 4:循環 getchar() ✅ 標準、可移植、健壯

#define CLEAR_STDIN() do { int c; while ((c = getchar()) != '\n' && c != EOF); } while(0)

// 使用示例
scanf("%d", &num);
CLEAR_STDIN(); // 清空殘留換行
scanf("%c", &ch); // 正常等待輸入

測試驗證

輸入:8⏎ s⏎
輸出:hello bit
(程序正常等待字符輸入,無跳過)

總結

宏 CLEAR_STDIN() 是唯一符合 C 標準、跨平台、無副作用的通用方案。建議封裝在公共頭文件中,凡 scanf 後接字符/行讀取處必調用。

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