如果cin >> num
失敗,則需要從流中刪除無效輸入。我建議使用ignore
而不是sync
來完成此操作。原因是sync
是不是保證刪除的所有的剩餘輸入標準庫的實現。
#include <iostream>
#include <limits>
int main()
{
int num;
while (cout << "Enter a number" && !(cin >> num))
{
cin.clear(); // clear the error
// Remove input up to a new line
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
cout << "Invalid input; please re-enter.\n";
}
}
以上的例子使用std::numeric_limits<std::streamsize>::max()
用於檢索字符的輸入緩衝器可容納的最大數量。這允許ignore()
刪除儘可能多的字符到新行。這是慣用的C++,並且優於使用magic numbers,這很可能只是隱藏了你當前擁有的問題。
這很好,但不處理輸入包含數字後面多餘字符的情況。爲了處理這些情況,需要對循環進行一些修改以處理額外的驗證。一種選擇是從cin
中讀取整行,將其放入std::stringstream
中,從中讀取數字,然後執行其他驗證。有一種可能需要考慮的特殊情況 - 只有數字後面的字符是空格的行。幸運的是,標準庫提供了流修改器std::skipws
,可以輕鬆處理這種情況。下面的例子說明如何做到這一點沒有太大的避免費勁
#include <iostream>
#include <sstream>
int main()
{
int num;
for(;;)
{
std::cout << "Enter a number: " << std::flush;
std::string line;
std::getline(std::cin, line); // Read a line from console
std::stringstream text(line); // store in a string stream
char ch = 0;
if(!(text >> num).fail() && (text >> std::skipws >> ch).fail())
{
break;
}
std::cout << "Invalid input; please re-enter.\n";
}
return 0;
}
表達(text >> std::skipws >> ch).fail()
將跳過數之後出現,然後試圖讀取一個字符的所有空格。如果沒有字符可用,則讀取將失敗,指示用戶僅輸入了一個數字,而沒有其他字符。如果我們試圖用cin
這樣做,即使輸入有效,它也會等待用戶輸入更多文本。
你真的不應該寫這樣的代碼,很難理解發生了什麼,錯誤在哪裏。 – Djon
提示:http://en.cppreference.com/w/cpp/io/basic_istream/ignore – aschepler
@Djon我覺得代碼很清楚,錯誤很容易被發現。究竟是什麼困擾你呢? – jrok