do-while 无限循环与 if c++
do-while infinite loop with if c++
在这个循环中,用户应该输入一个 int
并且程序会检查它是否奇怪它将转到下一部分,但我不明白为什么如果用户输入一个不是 [=11 的字符=], 程序陷入死循环!
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)
但它没有帮助我。
请告诉我如何解决这个问题,以及为什么会这样。
因为你的程序没有检查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);
}
您还应该在此代码中添加代码来处理文件结尾 - 对于应该可以接受的文件输入 [除非文件具有标记结尾的特定数据]。对于交互式输入(用户直接向程序输入),文件末尾可能会或可能不会被视为错误 - 实际上取决于接下来会发生什么。
在您的程序中,标准输入流需要一个整数。当你给它一个字符时,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);
包括 limits.h 以使用 INT_MAX 或者您可以使用较大的值,例如 10000。
cin.clear
清除错误标志并使其准备好接受输入。
cin.ignore(INT_MAX,'\n')
忽略所有内容(最多 INT_MAX
个字符)直到下一个新行。这确保了如果用户输入长行而不是数字,程序将正常工作。
我找到了解决问题的方法,我将输入类型更改为 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 之间,它将 return 作为 int
输入,否则它将 return 0;
给我,所以我使用 return ed int
作为我的 num
.
在这个循环中,用户应该输入一个 int
并且程序会检查它是否奇怪它将转到下一部分,但我不明白为什么如果用户输入一个不是 [=11 的字符=], 程序陷入死循环!
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)
但它没有帮助我。
请告诉我如何解决这个问题,以及为什么会这样。
因为你的程序没有检查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);
}
您还应该在此代码中添加代码来处理文件结尾 - 对于应该可以接受的文件输入 [除非文件具有标记结尾的特定数据]。对于交互式输入(用户直接向程序输入),文件末尾可能会或可能不会被视为错误 - 实际上取决于接下来会发生什么。
在您的程序中,标准输入流需要一个整数。当你给它一个字符时,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);
包括 limits.h 以使用 INT_MAX 或者您可以使用较大的值,例如 10000。
cin.clear
清除错误标志并使其准备好接受输入。
cin.ignore(INT_MAX,'\n')
忽略所有内容(最多 INT_MAX
个字符)直到下一个新行。这确保了如果用户输入长行而不是数字,程序将正常工作。
我找到了解决问题的方法,我将输入类型更改为 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 之间,它将 return 作为 int
输入,否则它将 return 0;
给我,所以我使用 return ed int
作为我的 num
.