如何解决cin.fail()中的循环

时间:2016-12-25 08:50:39

标签: c++

知道为什么会这样吗?

sample run

void askNQ(int &noq)
{
    bool x = true;
    while (x)
    {
        int i;
        cout << "How many questions would you like(out of " << noq << ")?" << endl;
        cin >> i;

        if (cin.fail())
        {
        cin.clear();
        cin.ignore();
        cout << "Sorry, that is not valid." << endl;
        x = true;
        }
        else if (i > noq)
        {
            cout << "Sorry, that is too many." << endl;
            x = true;
        }
        else if (i <= 0)
        {
            cout << "Sorry, that is too less." << endl;
            x= true;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

cin.ignore();实际上是对cin.ignore(1, char_traits<char>::eof());的调用。

因此,您不会从任何剩余的换行符中清除缓冲区。

以下内容应解决您的问题:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

它清除下一个换行符,无论它在缓冲区中有多远(出于所有实际目的)。

答案 1 :(得分:0)

您应该在命令行中输入numeric,因为变量“i”是整数。