在这个循环中,用户应该输入一个int
并且程序检查它是否奇怪它会转到下一个部分,但是我不明白为什么如果用户输入的字符不是int
,程序正处于无限循环中!
int num;
do {
cout << "PLEASE enter the num: ";
cin >> num;
if (num % 2 == 0)
cout << "Number should be odd!" << endl;
else
break;
} while (true);
//...
无论如何char/int != 0
,如果它是==0
,它应该停在下一个cin
,但它不会停止!
我也试过了ws(cin)
,但它对我没有帮助。
请告诉我如何解决这个问题,以及为什么会这样。
答案 0 :(得分:4)
因此,您的计划不会检查cin >> num;
的结果。由于cin >> num;
(其中num
是一个整数)将读取所有可用数字,如果输入不是数字[而不是空格字符,则由cin >>
跳过],然后它反复尝试读取输入。
当用户向您的程序输入“askjhrgAERY8IWE”时,您的问题并不清楚您想要做什么 - 有两种解决方案可以想到:
Alt 1.删除错误输入后再次询问。这可能适合这个应用程序,因为它是交互式的,但对于从文件读取其输入的自动程序来说这是一个糟糕的想法。
if(!(cin >> num))
{
cout << "That deoesn't seem to be a number..." << endl;
cin.clear();
cin.ignore(10000, '\n');
}
Alt 2.退出并显示错误消息。当典型输入是数据文件时,这显然是正确的。
if(!(cin >> num))
{
cout << "That deoesn't seem to be a number..." << endl;
exit(1);
}
您还应该添加代码来处理此代码中的文件结尾 - 对于文件输入应该是可接受的[除非文件具有标记结尾的特定数据]。对于交互式输入(用户直接键入程序),文件结尾可能会或可能不会被视为错误 - 实际上取决于接下来会发生什么。
答案 1 :(得分:0)
在您的程序中,标准输入流需要一个整数。当你给它一个字符时,cin不能把它放在整数变量中,即它失败(设置了错误标志)并将输入的字符留在缓冲区中(用于下一个cin赋值)。 cin反复将该字符视为输入并保持失败,并将整数变量赋值为0.
为了防止您将程序修改为
int num;
do{
cout << "PLEASE enter the num: ";
while(!(cin>>num)){
cin.clear();
cin.ignore(INT_MAX,'\n');
cout<<"Invalid. Enter a number";
}
if (num % 2 == 0)
cout << "Number should be odd!" << endl;
else
break;
}
while(true);
包括使用INT_MAX的limits.h,或者你可以使用像10000这样的大值。
cin.clear
清除错误标志并准备好接受输入。
cin.ignore(INT_MAX,'\n')
忽略所有内容(最多INT_MAX
个字符),直到下一个新行。如果用户输入长行而不是数字,这可以确保程序正常工作。
答案 2 :(得分:0)
我找到了解决问题的方法,我将输入类型更改为string
并将其作为一个函数:
int isNum(string input)
{
int digit, value = 0;
for (int i = 0; i < input.length(); i++)
{
digit = input[i] - '0';
if (digit >= 0 && digit <= 9)
value = value * 10 + digit;
else
{
value = 0;
break;
}
}
return value;
}
如果所有字符都在0到9之间,它会将输入返回int
,否则它会return 0;
给我,所以我使用返回的int
作为{{1} }}