我正在使用netbean ide进行c ++学习 我想强制用户只选择1到3之间的数字
int displayMenu()
{
while(true)
{
cout<<"Please choose one of following options"<<endl;
cout<<"1. deposit"<<endl;
cout<<"2. withdraw"<<endl;
cout<<"3. exit"<<endl;
int input;
cin >>input;
if(input>=1 && input<=3 && cin)
{
return input;
break;
}
else
{
cout<<"You have only 3 options. Please chooses 1,2 or 3"<<endl;
}
}
}
如果输入是int数,它可以正常工作 如果输入小于1或大于3,则此功能重新要求用户输入数字btw 1和3.
但是,如果输入是诸如&#39; f&#39;之类的字符,则它会执行无限循环。 这个功能知道&#39; f&#39;是错误的输入..
我在互联网上做了自己的研究。 !cin和cin.fail()不起作用。
你能帮助我吗?
答案 0 :(得分:0)
当您尝试读取整数但传递其他内容时,读取失败并且流变为无效。无论是什么导致错误仍留在流中。这会导致无限循环。
要解决此问题,请清除错误标志并忽略else子句中的其余部分:
else
{
cout<<"You have only 3 options. Please chooses 1,2 or 3"<<endl;
cin.clear(); // remove error flags
// skip until the end of the line
// #include <limits> for std::numeric_limits
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
答案 1 :(得分:0)
您可以像这样修改它:
int displayMenu()
{
while(true)
{
cout<<"Please choose one of following options"<<endl;
cout<<"1. deposit"<<endl;
cout<<"2. withdraw"<<endl;
cout<<"3. exit"<<endl;
char input = cin.get(); //read a character
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //skip the rest of characters in cin buffer so that even if a user puts "123" only the first one is taken into account
if(input>='1' && input<='3' && cin) //check whether this is '1', '2' or '3'
{
return input;
break;
}
else
{
cout<<"You have only 3 options. Please chooses 1,2 or 3"<<endl;
}
}
}