場景:scanf("%d") 後緩衝區殘留 \n,導致後續 scanf("%c") 直接讀到換行符。
fflush(stdin) ❌ 不推薦fflush(stdin); // C標準未定義行為,僅MSVC支持,不可移植
scanf("%*[^\n]") ❌ 脆弱scanf("%*[^\n]"); // 讀取並丟棄直到換行,但若緩衝區為空會陷入等待,易失效
setbuf(stdin, NULL) ⚠️ 副作用大setbuf(stdin, NULL); // 將stdin設為無緩衝,影響後續所有輸入性能,不建議常規使用
#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 後接字符/行讀取處必調用。