阻止cin继续接受输入

时间:2019-01-31 10:32:24

标签: c++

我正在制作一个小程序,旨在向用户询问一个介于特定范围之间的数字,并且需要确保它实际上是一个实际数字。

int main()
{
    double initEstimate = 99;
    int tries = 0;

    do
    {
        tries++;
        cout<<"enter value: ";
        cin>>initEstimate;

        if( initEstimate < -10 || initEstimate > 10 )
        {
            cout<<"value not in range"<<endl;
            initEstimate = 99;
        }

        else if( cin.fail() )
        {
            cout<<"not a number"<<endl;
            cin.ignore();
            cin.clear();
            initEstimate = 99;
        }

        if(tries == 3)
        {
            cerr<<"error: too many tries"<<endl;
            return 1;
        }

    }while(initEstimate == 99);

    cout<<"\n\nsuccess"<<endl;
    return 0;
}

当测试输入是否在范围内时,一切工作都很好,但是,当测试输入是数字而不是其他字符时,我遇到了问题。例如,如果我在控制台中输入“ a”,则程序会立即弹出所有尝试,并输出“太多尝试错误”。我已经在网上寻找了一个解决方案,但是找不到像我这样的人。 帮助一个兄弟:)

2 个答案:

答案 0 :(得分:1)

好吧,事实证明我只需要将cin.clear()语句放在cin.ignore()语句之前。我不知道为什么会这样,所以如果有人可以解释一下,我将不胜感激。

答案 1 :(得分:1)

当指示std::cin读取数字,但是遇到诸如“ abakjdb”之类的无用输入时,它将failbit设置为true,并拒绝更多输入。如果您std::cin.clear(),则failbit等将被清除(即设置为false),并且可以进行进一步的输入。

请咨询this cppreference page,以获取有关C ++输入流如何工作的更多信息。特别是,std::cin的类型为std::istream,定义为std::basic_istream<char, std::char_traits<char> >