为什么 while 循环会无限重复?

Why does this do while loop repeat infinitely?

我想提示用户输入一个整数,但如果用户输入一个非整数,程序会一直要求输入一个整数,直到用户同意为止。

int getInteger(){
    int input;

    do{
        std::cout << "Enter an integer: ";
        std::cin >> input;
    } while(!(std::cin));


    return input;
}

如果用户输入整数,函数returns就可以了。

但如果用户输入类似 "Hello," 的内容,该函数将无限期地 cout-ing "Enter an integer: ".

我该如何解决这个问题?

流转换为 true,同时设置了 none 个故障位。一旦流进入故障状态,即为流设置 std::ios_base::failbit(或 std::ios_base::badbit),它将保持该状态,直到使用 clear() 清除故障位。除了清除声明之外,您还需要摆脱导致它进入此状态的违规字符,例如,使用 ignore().

!(std::cin)
如果 std::cin 处于不良状态,例如

将评估为真输入操作失败后。然后,所有后续输入操作将立即失败,并且不会改变cin的错误状态,从而无限循环。

要获得您想要的行为,您可以使用类似

的东西
while (!(std::cin >> input)) {
    std::cout << "Try again\n";
    // Clear away the error state
    std::cin.clear();        
    // Ignore what ever garbage is still in the stream
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
}

在现实世界中,您可能想要处理(通常不可恢复的)故障 eof(有人发送了文件结束字符)和 badcin 已损坏, 不应该发生)不同于 fail 在无效输入后发生的情况。例如,这显示在 this reference page for ignore 上。然而,这不应该像你的玩具程序那样咬你。