我用几种方式重写了这个循环,使用嵌套的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之间,但为什么它不要求用户输入?我确实清除了缓冲区。
答案 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;
}