我创建了一个检查输入值的do-while循环(下面)。只允许输出这个循环的值是1和2.当我把双值ex。 1.2或4.5它隐式转换为整数(1和4值)。当我输入字符串值时,循环工作无穷大,我必须从头开始关闭控制台和调试。如何编写正确的循环来保护输入值不受double和string值的影响?
int triangle;
do{
cout << "Put the number (1 or 2): ";
cin >> triangle;
} while (triangle > 2 || triangle < 1 || !cin);
答案 0 :(得分:2)
int check()
{
string s;
cin >> s;
if(s.length() == 1)
{
if((s[0] == '1') || (s[0] == '2'))
{
return s[0] - '0';
}
}
return 0;
}
int main()
{
int triangle;
do
{
cout << "Put the number (1 or 2): ";
}
while (triangle = check());
return 0;
}
答案 1 :(得分:1)
您可以通过以下方式检查
int triangle;
cin >> triangle;
if (cin.fail()) {
//Not an int.
}
答案 2 :(得分:1)
1.初始化triangle
会更好。
2.当std::basic_istream::operator>>
提取失败时,将设置failbit。您应检查结果并致电std::basic_ios::clear
以清除错误状态,并std::basic_istream::ignore
跳过错误输入。
int triangle = 0;
for (;;) {
cout << "Put the number (1 or 2): ";
if (cin >> triangle) {
if (triangle == 1 || triangle == 2) break;
} else {
cin.clear(); // reset stream state after failure
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
}
}
答案 3 :(得分:-2)
scanf(“%d”,&amp; triangle)如果读取一个整数,则返回1。
所以你可以这样做(它也照顾EOF)
printf("Enter option (1 or 2)\n");
while(~scanf("%d", &n))
{
if (n!=1 && n!=2)
break;
printf("Enter option (1 or 2)\n");
}