我是C ++的新手并且在课堂上。我正在尝试完成第一个项目,到目前为止我的一切工作正常,但是,我需要用户输入一个数字来选择他们的级别,并且想要验证它是一个数字,并且该数字不是太大了。
while(levelChoose > 10 || isalpha(levelChoose))
{
cout << "That is not a valid level" << endl;
cout << "Choose another level:";
cin >> levelChoose;
}
这就是我制作的循环,它有时会起作用。如果我输入11它会打印错误,让我选择另一个级别。但是,如果数字很大,或者是任何字母字符,它会使couts充满屏幕,并且循环不会结束,我必须强制退出。为什么它有时会停在cin并等待用户输入,有时候不是?谢谢你的帮助!
答案 0 :(得分:3)
这是一个恼人的cin问题(一般来说是一个很奇怪的问题)。 cin是类型安全的,所以如果你给它错误的类型它将失败。正如你所说的非常大数字或非数字输入,它会陷入无限循环。这是因为那些与可能的类型级别不相容。 cin失败了,但缓冲区仍然填充了你输入的内容,因此cin一直试图读取它。你最终陷入了无限循环。
要解决此问题,您需要清除失败位并忽略缓冲区中的所有字符。下面的代码应该这样做(虽然我还没有测试过):
while(levelChoose > 10 || isalpha(levelChoose))
{
cout << "That is not a valid level" << endl;
cout << "Choose another level:";
if(!(cin >> levelChoose))
{
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
修改:numeric_limits&lt;&gt;位于限制范围内包括:
#include<limits>
答案 1 :(得分:2)
从您的描述中,似乎(几乎可以肯定)levelChose
是某种数字类型,可能是整数。
当您使用operator>>
读取数字时,任何不能成为数字一部分的内容(例如,大多数字母)都将保留在输入缓冲区中。发生的事情是你试图读取数字,它失败并将非数字留在缓冲区中,打印出错误信息,然后再尝试从缓冲区读取完全相同的非数字。
通常,当这样的输入失败时,你想要做的事情就是忽略输入缓冲区中的所有内容直到下一个换行符。
答案 2 :(得分:0)
levelChoose似乎是某种形式的整数类型(int,long,等等)。
将字符直接输入到整数中是无效的。输入失败,但是将字符留在传入缓冲区中,所以当循环再次出现时它仍然存在。
答案 3 :(得分:-1)
我怀疑部分while(levelChoose > 10
.....这不会将级别限制为小于10(假设在您的上下文中大于10是一个大数字)。相反,可能应为while(levelChoose < 10...
要检查表达式是否太大,可以验证以下内容(脑编译代码!!)
const unsigned int MAX = 1000;
unsigned int x;
cin >> x;
while(x < MAX){}