有没有办法使用cin.clear()或cin,ignore()仅用于上一行输入而不清除以前的所有输入?例如,在我的代码中,我提示用户输入每个月,如果输入小于0,我希望程序清除该负输入,以便它不会完全进入我的计算。问题是它清除所有先前的输入仍然搞砸了计算。提前感谢任何想法。
// prompt user for input, keep a total sum of data entered
for(int i = 0; i < 12; i++)
{
cout << "Enter total rainfall for " << year[i] << endl;
cin >> month[i];
total += month[i];
while(month[i] < 0)
{
cout << "Ony enter positive numeric values!" << endl;
cin.clear();
cin >> month[i];
}
}
答案 0 :(得分:3)
你似乎在混淆两个不同的问题。 ios_base::clear()
不删除任何输入;它会重置流的错误状态。
另一方面,istream::ignore( n, ch )
向前读,直到n
已提取字符或看到字符ch
myInput.ignore( INT_MAX, '\n' )
应该忽略所有内容(和
包括)下一个'\n'
。
但是你的代码有一件很奇怪的事情:
cin << month[i];
您无法输出到std::cin
。
答案 1 :(得分:1)
你可能想要这样的东西:
unsigned int month[12];
for(size_t i = 0; i < 12; i++)
{
cout << "Enter total rainfall for month " << i+1 << endl;
while (!(cin >> month[i]))
{
cout << "Invalid input, try again." << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
// you probably want to repeat ignore() stuff here
// so in case user inputs something like 10x, the "x" that was left
// in the stream gets discarded
}
注意无符号整数数组。这样,“-5”之类的输入自动被视为无效,因此您不需要小于0的检查。清除整个流不应该担心 - 如果输入操作成功,相关部分已经存储在您的数组中。