【问题标题】:Stop cin from continuing to take in inputs阻止 cin 继续接受输入
【发布时间】:2019-01-31 18:46:10
【问题描述】:

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

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”,程序会立即遍历所有尝试并输出“尝试次数过多错误”。我已经在网上广泛寻找解决方案,但找不到像我这样的问题的人。 帮兄弟解惑:)

【问题讨论】:

标签: c++


【解决方案1】:

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

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • @NelsonGon 如果您没有注意到,这是我在回答我自己的问题,所以是的,这实际上提供了问题的答案。
  • 我明白了,下次会注意的。我的错!
【解决方案2】:

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

请咨询this cppreference page,了解有关 C++ 输入流如何工作的更多信息。特别是,std::cin 的类型为std::istream,它被定义为std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 2012-01-24
    • 2016-09-01
    • 2017-09-23
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多