虽然循环没有结束

时间:2012-11-04 10:00:33

标签: c++ while-loop

我用几种方式重写了这个循环,使用嵌套的Ifs和​​dos,但行为是相同的。只要用户不输入字符或字符串,它就会按预期运行。一旦用户这样做,就继续旋转循环直到我CTRL + C它。

根据我的研究,当一个变量是一个数字并且用户输入一个字符或一个字符串时,它们只是被转换成它们的ASCII数字,在这种情况下,while检查应该有效。该数字应该大于允许的数量,并且应该提示用户输入新值吗?为什么它会无限循环?

宽度声明为浮动。

void setWidth ()
{
    std::cout << "\nPlease enter the width (use numbers greater than 0 and no greater than 20.0).\n";
    std::cin >> width;
    while (width <= 0 || width > 20)
    {
        std::cin.clear();
        std::cin.ignore();
        std::cout << "You have entered a number outside of the allowed range.\nPlease enter a number greater than 0 and no greater than 20.\n";
        std::cin >> width;
    }
}

就像我说的那样,对于数字而言,它的效果很好,双重,负面,无论如何。但是像“asdf”或“a”这样的东西会让它无限旋转。

好像我已经尝试了一切。为什么会这样?我的意思是我知道它为什么循环,这是因为数字不在0到20之间,但为什么它不要求用户输入?我确实清除了缓冲区。

5 个答案:

答案 0 :(得分:4)

std::cin >> width;失败,因为输入不是数字。它也不消耗任何输入,因此你陷入无限循环。

要避免这种情况,您应该使用std::getline()阅读输入,然后尝试转换它(std::ostringstream是一个选项),相应地处理和报告失败。

答案 1 :(得分:3)

cin.ignore()的默认值是忽略一个字符。

如果你想忽略更长的字符串,你必须为其添加额外的参数,可能cin.ignore(1000, '\n')跳过最多1000个字符或下一个换行符(以先到者为准)。

答案 2 :(得分:1)

cin :: clear()“为错误控制状态”1设置一个新值,但剩下的输入仍然在这里仍然可以读取。

然后我猜实际的行为取决于编译器,因为当我用g ++ 4.6.3编译它并键入输入“abc”时,它只循环三次然后等待另一个输入。

要清空cin缓冲区,您可能会看到How do I flush the cin buffer?

答案 3 :(得分:0)

尝试检查cin

上的failbit

答案 4 :(得分:0)

好的,感谢所有的帮助人员...我终于设法让它与cin(不是getline)一起工作,完全按照我正在做的事情,除了我做了一个clearBuffer()函数。因此,getWidth函数不是从getWidth函数中清除缓冲区,而是调用另一个函数..从而使getWidth函数执行一些代码...然后返回运行其余的代码......

出于某种原因,当它超出函数时它工作正常,字符串和字符触发错误..但如果cin.clear和cin.ignore保持在函数内,那么我就有了这个问题。

所以最终的代码看起来像这样。

void clearBuffer()
{
    std::cin.clear();
    std::cin.ignore(80, '\n'); //Ignore the first 80 characters up to an Enter character.
}

void setWidth ()
{
    std::cout << "\n\t\tPlease enter the width.\n(use numbers greater than 0 and no greater than 20.0).\n";
    float temp = NULL; //Using temp here so that we dont write invalid characters to an actual variable.
    std::cin >> temp;
    clearBuffer();
    while (temp <= 0 || temp > 20)
    {
        std::cout << "\nERROR: You have entered width outside of the allowed range.\nPlease enter a number greater than 0 and no greater than 20.\n";
        std::cin >> temp;
        clearBuffer();
    }
    if(temp > 0 && temp <= 20)
        width=temp;
}