cin.fail没有按预期工作

时间:2018-02-23 17:56:31

标签: c++ do-while cin

为什么此代码在正确的整数输入上运行两次?在第一个输入整数上,它再次要求输入然后退出正确的输入。是否存在与cin范围相关的内容?

#include <iostream>
using namespace std;

int main()
{
    int q1 = 1;
    do
    {
        cin.clear();
        cin.ignore();
        cin >> q1;
    }
    while(cin.fail());
    return 0;
}

1 个答案:

答案 0 :(得分:1)

在第一次迭代中,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;
}