這包括在isocpp.org faq。它建議以while (std::cin >> i)
的形式使用循環,以便循環在提取失敗時終止。提取將繼續失敗,因爲std::cin
不會從輸入流中提取無效字符。要放棄這些,您需要使用std::cin.ignore
。一般情況下,您可以將任意大的數字作爲第一個參數,但使用std::numeric_limits<std::streamsize>::max()
(#include <limits>
)代替地址。
循環可以簡潔地寫爲:
while(!(std::cin >> choice) || (choice < 0) || (choice > 6)) {
cout << "Invalid choice." << endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
或者,你可以把提示的循環條件:
while((std::cout << "Selection: ")
&& (!(std::cin >> choice) || (choice < 0) || (choice > 6))) {
cout << "Invalid choice." << endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
沒有必要爲「無效字符」的診斷,因爲這是涵蓋!(std::cin >> choice)
。舉例來看:
Selection: a
Invalid choice.
Selection: b
Invalid choice.
Selection: c
Invalid choice.
Selection: d
Invalid choice.
Selection: 15
Invalid choice.
Selection: 10
Invalid choice.
Selection: 5
的[?我如何刷新CIN緩衝]
可能重複(http://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer) – edmz 2014-10-10 15:28:03