我在这里有一个while循环,只接受1和2作为数字,如果我插入和不是这些我的else语句的数字将继续要求正确的一个,这是正常的。但如果我插入一封信,我的其他声明将永远循环。我怎样才能解决这个问题?
#include <iostream>
using namespace std;
int main()
{
int myChoice;
cin >> myChoice;
while ( myChoice >= 2 || myChoice <= 1)
{
if (myChoice == 1)
{
cout <<"food1";
break;
}
else if (myChoice == 2)
{
cout <<"food2";
break;
}
else
{
cout << " " << endl;
cout << "Please select the proper choices" << endl;
cout << "Try again: ";
cin >> myChoice;
}
}
return 0;
}
答案 0 :(得分:5)
如果输入非数字,则cin >> myChoice
会失败。这意味着它在输入缓冲区中保持输入完整,当你再次到达那里时它会尝试解析它并失败,依此类推......你必须清除错误状态并忽略非数字。最简单的方法是这样的:
cout << "Try again: ";
cin.clear(); // clear error state
cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); // ignore till the end of line
cin >> myChoice;
答案 1 :(得分:3)
这里的问题是cin&gt;&gt;运营商希望收到int
输入并收到char
输入。
istream
模块,其中cin
是一个实例,正在使用缓冲I / O.这意味着用户输入首先存储在缓冲区中,然后当用户程序访问&gt;&gt;时从该缓冲区读取。运营商。通常,如果&gt;&gt;运算符成功地读取和解析用户输入,从缓冲区中提取读取数据并且下一次调用&gt;&gt;操作员将在最后一次呼叫停止的地方继续。但是,在你的情况下,&gt;&gt;运算符尝试将用户输入解析为数字并失败,因为它包含非数字的非法字符。 &gt;&gt;在这种情况下,运算符不从缓冲区中提取读取数据,并且在以下对&gt;&gt;的调用中反复引用相同的数据。操作
你应该在失败时清空缓冲区,例如ybungalobill建议的方式。
答案 2 :(得分:2)
您的while
条件始终为true
,然后您使用break
退出循环。你可以简化这样的事情:
#include <iostream>
using namespace std;
int main()
{
int myChoice;
cin >> myChoice;
while( myChoice != 1 || myChoice != 2 ) {
cout << endl;
cout << "Please select the proper choices" << endl;
cout << "Try again: ";
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
cin >> myChoice;
}
// At this point myChoice is 1 or 2
if (myChoice == 1)
cout << "food1";
else if (myChoice == 2)
cout << "food2";
}