涉及多次运行“cin.fail()”的循环

loop involving "cin.fail()" running multiple times

提问人:punypaw 提问时间:4/16/2021 更新时间:4/16/2021 访问量:391

问:

我在使用以下代码时遇到了问题。它旨在不断要求有效输入,直到输入整数或双精度。它按预期工作,但是当我输入长度大于 1 的字符串时,它将多次运行循环。例如,输入“hello”,并导致“请输入有效号码”,打印 5 次。有趣的是,“h llo”只会打印句子 4 次。

int gamenumber;

while(true)
{
    cin >> gamenumber;
    
    if(cin.fail())
    {
        cout << "Please enter a valid number" << endl;
        cin.clear();
        cin.ignore();
        
    } else
        break;

我确实设法通过将“cin.ignore()”替换为“cin.ignore(1000, '\n')”来解决这个问题。

但无论如何,我不明白为什么仅靠“cin.ignore()”不能解决这个问题,这让我很烦恼?有没有办法在不使用“cin.ignore(1000, '\n')”的情况下修复上述代码?(这是家庭作业的一部分,我们可能不允许使用“cin.ignore(1000, '\n')”)

谢谢!

C++ 输入 IOSTREAM CIN

评论

0赞 David C. Rankin 4/16/2021
你想要吗?std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');

答:

1赞 prehistoricpenguin 4/16/2021 #1

您需要与重载的一起使用,请参阅此处的 anser。ignore

或者你只需要运行来排空内容物,但这种方式更慢且没有必要。getline

#include <iostream>
#include <string>
 
int main()
{
    double n;
    while( std::cout << "Please, enter a number\n"
           && ! (std::cin >> n) )
    {
        std::cin.clear();
        std::string line;
        std::getline(std::cin, line);
        std::cout << "I am sorry, but '" << line << "' is not a number\n";
    }
    std::cout << "Thank you for entering the number " << n << '\n';
}

评论

1赞 Blastfurnace 4/16/2021
与其读入一个字符串(可能分配内存),然后被销毁,不如正确使用忽略跳过该行的其余部分
0赞 prehistoricpenguin 4/16/2021
@Blastfurnace 比!getline