[英]Input Error Checking in c++
int x; // intitialize x but don't immediately prompt for input. This makes the program more user friendly
cout << "Enter a year to check if it's a leap year: " << endl;
cin >> x;
while (cin.fail()) // check for input error
{
cin.clear();
cin.ignore();
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
我在理解失敗狀態如何在C ++中工作時遇到了麻煩。 我想發生的是,如果用戶輸入的內容中包含除數字以外的任何內容,它將清除緩沖區並提示您進行其他輸入。 我的代碼似乎沒有做到這一點。 如果我輸入類似r4之類的內容,那么我的其余代碼(效果很好,因此我沒有在下面顯示)將與這四個代碼一起運行。 似乎在某個時候激活了循環。 提示字符串仍然打印。 只是它並沒有給我機會重新輸入並繼續檢查。
下表是從http://en.cppreference.com/w/cpp/io/basic_ios/fail獲取的 ,顯示了影響istream::fail()
返回值的各種狀態。
鑒於此,您應該使用:
while (cin.fail()) // check for input error
{
if ( cin.eof() )
{
// Once EOF file has been reached with cin,
// you can't do much. Figure out a way to bail
// from the loop.
}
cin.clear();
// Also, ignore not just one character but till the end of the line.
// cin.ignore();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
cin >> x;
cin
檢查緩沖區中是否有任何東西。 緩沖區為空,因此它將等待用戶按下回車鍵,然后將所有內容復制到緩沖區中( r4
)。 然后,它嘗試從緩沖區加載到int
。 第一個字節是r
,因此它設置流的故障狀態並中止。 r4
保留在緩沖區中。
cin.clear();
這將清除故障狀態, r4
保留在緩沖區中。
cin.ignore();
這將忽略緩沖區中的第一個字符。 4
保留在緩沖區中。
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
cin
檢查緩沖區中是否有任何東西, 並且有 ( 4
),因此它將嘗試從緩沖區加載到int
,該操作成功並如您所見繼續。
通常的解決方案是使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\\n')
,它忽略行的其余部分。
cin.good()
或cin.fail()
會告訴您是否可以處理輸入(有效) cin.clear()
在需要時清除錯誤狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.