我尝试使用if(!cin)来验证用户输入是否真的是整数。然而,我的程序然后进入一个无限循环,从不问新的输入
do{
cin >> temp->data;
if(!cin){
cout << "Please enter a Number!" << '\n';
correct=false;
}
}while(correct==false);
如果有人可以帮助我,那会很棒。)
答案 0 :(得分:3)
当std :: cin无法读取输入时,会设置相应的错误标志。因此,您希望使用std :: cin.clear()重置标志,以便下一个输入操作正常工作,然后跳过所有内容,直到新行使用std :: cin.ignore(..)以避免类似格式化输入。
while (!(std::cin >> temp->data))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "\nPlease enter a number!" << std::endl;
}
std::numeric_limits<std::streamsize>::max()
返回流可以容纳的最大字符数,以确保忽略整行。
答案 1 :(得分:0)
使用cin.fail()
检查用户是否输入了正确的输入。如果最后cin.fail()
命令失败,则true
返回cin
,否则返回false
。此外,您的循环可能是无限的,因此您还必须说明else
,其中您将检查标记correct
设置为true
。因此,要使循环条件无效并在用户输入正确输入的情况下退出循环(参见下面的代码):
do{
cin >> temp->data;
if(cin.fail()){
cin.clear();
cin.ignore(10000, '\n');
cout << "Please enter a Number!" << '\n';
correct=false;
} else {
correct=true;
}
}while(correct==false);
答案 2 :(得分:0)
如果您想进行此类检查,请将cin
的数据读取到string
并将string
转换为数字:
string str;
do{
cin >> str;
if(!cin){
cout << "Please enter a Number!" << '\n';
correct=false;
}
else{
istringstream stream(str);
stream >> temp->data;
if(!stream){
cout << "Please enter a Number!" << '\n';
correct=false;
}
}
}while(correct==false);
答案 3 :(得分:0)
你的纠正&#39;变量实际上并没有像你使用它那样做任何事情。如果correct
为真,则无法退出循环;所以你可以取消它,只需在读完数字时使用循环退出命令。
此外,到目前为止发布的答案都没有处理输入被关闭。在那种情况下,它们将进入无限循环。
// A loop; we will break out when we successfully read a number.
while ( 1 )
{
// Prompt for a number and read it
cout << "Please enter a Number!" << endl;
cin >> temp->data;
// Exit loop if we successfully read
if ( cin )
break;
// Check to see if we failed due to the input being closed
if ( cin.eof() )
{
cerr << "End of input reached.\n";
return 0; // depends what your function returns of course
}
// reset the error condition that was caused by trying to read an integer and failing
cin.clear();
// discard anything they previously typed
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
从此开始,一个好的设计就是让这段代码本身就是一个完整的功能。然后,您可以在需要安全地获取号码时调用该函数,而无需重复代码。函数声明可能是:
void input_number(int &the_number, std::istream &in, std::string prompt);
将输出the_number
,它将通过抛出异常或依靠调用者检查!cin
或甚至返回{{1}来处理文件结束}};无论你的整体错误处理最适合什么。
答案 4 :(得分:0)
例如,如果您在!
语句中的条件之前放置“ if
”。应该是“非”运算符。