[英]Does cin.ignore with a limit continue discarding new input?
我正在努力學習C ++,並且已經陷入了一種帶有一些我無法理解的cin
行為的rabbithole。 這是我的代碼:
#include <iostream>
using namespace std;
int main()
{
int num;
// Get valid input
do
{
if (!cin)
{
// Clear error state and flush any garbage input
cin.clear();
cin.ignore(numeric_limits<streamsize>::max());
}
cout << "Please enter a number: ";
cin >> num;
} while (!cin);
// Echo back what we heard
cout << "You entered: " << num << "\n";
cin.get();
}
這里的問題是,當我第一次輸入無效輸入(例如一些字母字符)時,程序會卡在cin.ignore(numeric_limits<streamsize>::max())
語句中。 我可以繼續輸入內容(包括換行符),程序永遠不會超過該語句。
據我所知,這表明如果cin.ignore
的第一個參數超過緩沖區的當前大小,任何未來的字符(直到提供的限制)將繼續被丟棄。 它是否正確? 如果它是正確的,我如何清除輸入緩沖區而不影響將來的輸入?
注意:出於某種原因,使用cin.ignore(numeric_limits<streamsize>::max(), '\\n')
,並在cin >> num
之后添加cin.ignore()
使代碼正常工作。 這只是為了澄清我知道這種可能性存在,但我仍然有興趣了解上面的代碼中出現了什么問題(未指定\\n
分隔符)。
您的代碼正在清除任何錯誤標志,然后丟棄其他字符,直到命中了numeric_limits<streamsize>::max()
的硬限制或EOF
字符(通常可以通過Ctrl + Z輸入一個)。 因此,正如您所懷疑的那樣,它會不斷丟棄您的輸入。
代碼的固定版本只能丟棄字符,直到找到換行符
#include <iostream>
#include <limits>
using namespace std;
int main()
{
int num;
// Get valid input
do
{
if (cin.fail())
{
// Clear error state and flush any garbage input
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
cout << "Please enter a number: ";
cin >> num;
} while (cin.fail());
// Echo back what we heard
cout << "You entered: " << num << "\n";
cin.get();
}
可能是一個更慣用和緊湊的版本
#include <iostream>
#include <limits>
using namespace std;
int main()
{
int num;
// Get valid input
while( (cout << "Please enter a number: ") && !(cin >> num) )
{
cout << "Invalid number entered" << endl;
// Clear error state and flush any garbage input
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
}
// Echo back what we heard
cout << "You entered: " << num << "\n";
cin.get();
}
正如您所提到的, cin.rdbuf()->in_avail()
可能是一個更簡單的解決方案,因為它將完全丟棄可在流中讀取的字符數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.