fflush(stdin):廣泛使用但標準未定義的危險做法許多教材與開發者習慣在 scanf 後呼叫 fflush(stdin) 清空輸入緩衝區,解決非數字輸入導致的無窮迴圈問題。但這在 C/C++ 標準中屬於未定義行為。
C99 標準(7.21.5.2)明確指出:
若
stream指向輸出流或最近未執行輸入操作的更新流,fflush將未寫入資料傳送至宿主環境;否則行為未定義。
stdin 為輸入流,呼叫 fflush(stdin) 即屬「否則」情況。
int c;
while ((c = getchar()) != '\n' && c != EOF); // 「吃掉」殘留字元
或使用 scanf("%*[^\n]"); getchar();(注意會殘留 \n)。
#include <iostream>
#include <limits>
std::cin.clear(); // 清除錯誤狀態旗標
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 忽略至換行
// C++ 版
int value;
while (true) {
std::cout << "請輸入整數: ";
if (std::cin >> value) break; // 成功讀取整數
if (std::cin.eof() || std::cin.bad()) break; // 檔案結束或硬體錯誤
std::cin.clear(); // 重置 failbit
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 清空緩衝區
std::cout << "輸入無效,請重試。\n";
}
scanf/cin >> 失敗時,非法字元留在緩衝區,下次讀取會再次失敗clear()),再清空緩衝區(ignore() 或迴圈 getchar())