2

我用几种方法重写了这个循环,使用嵌套的 If 和 do while,但行为是相同的。只要用户不输入字符或字符串,它就会按预期运行。一旦用户这样做,它就会继续旋转循环,直到我 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 之间,但为什么它不要求用户输入?我确实清除了缓冲区。

4

5 回答 5

4

The line std::cin >> width; fails because the input isn't a number. It also doesn't consume any of the input, so you are stuck in an infinite loop.

To avoid this, you should read the input using std::getline(), then try to convert it (std::ostringstream is one option), handling and reporting failures accordingly.

于 2012-11-04T10:09:18.677 回答
3

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

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

于 2012-11-04T10:18:31.167 回答
1

cin::clear() "Sets a new value for the error control state" 1,但剩余的输入仍然在这里并且仍然可以读取。

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

要清空 cin 缓冲区,您可能更愿意看到如何刷新 cin 缓冲区?

于 2012-11-04T10:31:12.833 回答
0

尝试检查cin上的故障位

于 2012-11-04T10:11:58.817 回答
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;
}
于 2012-11-05T03:57:24.760 回答