尝试使用while语句验证用户输入C++ 我是C++新手,我在课堂上。我正在努力完成第一个项目,到目前为止,我所有的工作都正常,但是,我需要用户输入一个数字来选择他们的级别,并希望验证它是一个数字,并且该数字不是太大 while(levelChoose > 10 || isalpha(levelChoose)) { cout << "That is not a valid level" << endl; cout << "Choose another level:"; cin >> levelChoose; }

尝试使用while语句验证用户输入C++ 我是C++新手,我在课堂上。我正在努力完成第一个项目,到目前为止,我所有的工作都正常,但是,我需要用户输入一个数字来选择他们的级别,并希望验证它是一个数字,并且该数字不是太大 while(levelChoose > 10 || isalpha(levelChoose)) { cout << "That is not a valid level" << endl; cout << "Choose another level:"; cin >> levelChoose; },c++,validation,C++,Validation,这就是我做的循环,有时也能起作用。如果我输入11,它会打印错误,并让我选择另一个级别。然而,如果数字很大,或者是任何字母字符,它就会在屏幕上充斥着couts,循环不会结束,我必须强制退出。为什么它有时会停在cin上等待用户输入,而有时则不会?谢谢你的帮助 levelChoose似乎是某种形式的整数类型int、long等等 这样直接将字符输入整数是无效的。输入失败,但将字符留在传入缓冲区中,因此当循环再次出现时,字符仍在那里 这里有一个相关的问题:根据您的描述,似乎几乎可以肯定LevelSelec

这就是我做的循环,有时也能起作用。如果我输入11,它会打印错误,并让我选择另一个级别。然而,如果数字很大,或者是任何字母字符,它就会在屏幕上充斥着couts,循环不会结束,我必须强制退出。为什么它有时会停在cin上等待用户输入,而有时则不会?谢谢你的帮助

levelChoose似乎是某种形式的整数类型int、long等等

这样直接将字符输入整数是无效的。输入失败,但将字符留在传入缓冲区中,因此当循环再次出现时,字符仍在那里


这里有一个相关的问题:

根据您的描述,似乎几乎可以肯定LevelSelected是某种数字类型,可能是一个整数

当您使用运算符>>读取数字时,任何不能作为数字一部分的内容(例如,大多数字母)都将保留在输入缓冲区中。发生的情况是,您试图读取数字,但失败了,将非数字保留在缓冲区中,打印出错误消息,然后再次尝试从缓冲区读取完全相同的非数字

一般来说,当这样的输入失败时,您需要做一些事情,比如忽略输入缓冲区中的所有内容,直到下一行。

我怀疑部分是在级别选择>10。。。。。假设在您的上下文中大于10是一个很大的数字,则这不会将级别限制为小于10。相反,它可能应该选择<10

要检查表达式是否过大,可以使用以下方法验证brain编译的代码

const unsigned int MAX = 1000;

unsigned int x;
cin >> x;

while(x < MAX){}

这对于cin和istreams来说是一个恼人的问题。cin是类型安全的,因此如果您给它错误的类型,它将失败。正如你所说,一个非常大的数字或非数字输入会陷入无限循环。这是因为它们与levelChoose的任何类型都不兼容。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');
    }
}
编辑:数字限制位于限制中,包括:

#include<limits>

levelChoose变量是什么类型的?通常最好提供一个不起作用的可编译代码示例。我们拥有诊断问题所需的一切,而不必问太多额外的问题。逻辑是正确的。他只是没有意识到cin需要在迭代之间刷新,否则缓冲区中可能会有垃圾值。编译器说数值限制尚未定义,尽管我已经包括了iostream,并且正在使用名称空间标准。对不起!我应该提到的是,你需要包括我在levelchoose>numLevels | | isalphalevelChoose{cout结束时这样做作为一个旁注,这可以删除alpha,但是如果这个数字太大,它只会退出循环并进入下一个语句。