为什么while循环无限重复?

时间:2016-01-24 22:34:37

标签: c++ loops std do-while cin

我想提示用户输入一个整数,但如果用户输入一个非整数,程序应该一直要求一个整数,直到用户符合。

int getInteger(){
    int input;

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


    return input;
}

如果用户输入一个整数,该函数将返回它。

但是如果用户输入类似“Hello”的内容,则该函数会进行无限的cout - “输入一个整数:”。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

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

将评估为true,例如输入操作失败后。然后,所有后续输入操作将立即失败,并且不会更改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显示ignore。但是,这不应该像你的玩具程序那样咬你。

答案 1 :(得分:3)

Streams转换为true,而没有设置任何失败位。一旦流进入故障状态,即为流设置std::ios_base::failbit(或std::ios_base::badbit),它将保持该状态,直到使用clear()清除故障位。除了清除陈述之外,您还需要摆脱导致它进入此状态的违规字符,例如,使用ignore()