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;
}