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

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

我在使用以下代码时遇到问题。它意味着一直要求有效输入,直到输入整数或双精度数。它按预期用于字符,但是当我输入长度超过 1 的字符串时,它将 运行 循环多次。比如输入“hello”,原因是“Please enter a valid number”要打印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')”)

谢谢!

您需要将 ignore 与重载的一起使用,请参阅此答案

或者你可以只需要 运行 getlinedrain 的内容,但是这种方式比较慢而且没有必要。

#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';
}