cin.fail 在 do while 中没有按预期工作
cin.fail not working as expected in do while
为什么此代码 运行 两次输入正确的整数?在第一个输入整数上,它再次要求输入,然后在正确的输入上退出。是否有与 cin 范围相关的内容?
#include <iostream>
using namespace std;
int main()
{
int q1 = 1;
do
{
cin.clear();
cin.ignore();
cin >> q1;
}
while(cin.fail());
return 0;
}
在第一次迭代中,cin.ignore();
意味着第一个字符将被忽略。使用调试器单步执行会告诉您 cin.ignore()
实际上会阻塞,直到您提供输入。如果您输入的是单个数字 int
,则该值将被忽略。然后,std::cin
会等到你再给一个值。在那种情况下循环只执行一次,但你必须提供两个值,所以看起来它执行了两次。
解决方案是仅在出现错误时忽略。您还应该忽略带有 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
的整个输入行,而不仅仅是 ignore
单个字符。请尝试以下操作:
#include <ios>
#include <iostream>
#include <limits>
int main()
{
int q1 = 1;
std::cin >> q1;
while (std::cin.fail()){
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin >> q1;
}
std::cout << q1;
return 0;
}
为什么此代码 运行 两次输入正确的整数?在第一个输入整数上,它再次要求输入,然后在正确的输入上退出。是否有与 cin 范围相关的内容?
#include <iostream>
using namespace std;
int main()
{
int q1 = 1;
do
{
cin.clear();
cin.ignore();
cin >> q1;
}
while(cin.fail());
return 0;
}
在第一次迭代中,cin.ignore();
意味着第一个字符将被忽略。使用调试器单步执行会告诉您 cin.ignore()
实际上会阻塞,直到您提供输入。如果您输入的是单个数字 int
,则该值将被忽略。然后,std::cin
会等到你再给一个值。在那种情况下循环只执行一次,但你必须提供两个值,所以看起来它执行了两次。
解决方案是仅在出现错误时忽略。您还应该忽略带有 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
的整个输入行,而不仅仅是 ignore
单个字符。请尝试以下操作:
#include <ios>
#include <iostream>
#include <limits>
int main()
{
int q1 = 1;
std::cin >> q1;
while (std::cin.fail()){
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin >> q1;
}
std::cout << q1;
return 0;
}