繁体   English   中英

c ++检查整数变量

[英]c++ check if integer variable

用户输入日期,当前已验证以确保该值介于1到31之间(包括1和31)。

但是,如果他们输入非整数值,它只会无限循环不断地重复错误消息。

我到处寻找答案,但是其他所有提出要求的人似乎都比我在c ++方面要先进得多,因此我什至不了解他们的初始代码。

这是代码

void Menu::setDate()
{
    date = 0;

    std::cout << "Please enter todays date: (as an integer) ";
    do
    {
        std::cin >> date;   
        if (date > 0 && date < 32)
        {
            break;
        }
        std::cout << "Error: Please enter todays date: (as an integer) ";
    }
    while (true);
 }

问题在于,当输入非数字时,流将变为错误状态。 您应该清除它并跳过无效输入。 例如

cin.clear();
cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );

您的代码的问题是输入无效整数时,流获取错误并设置为failbit。 因此,您需要先清除它,然后才能再次使用I / O操作。 尝试这个:

void Menu::setDate()
{
    date = 0;

    std::cout << "Please enter todays date: (as an integer) ";

    while(true){
        std::cin >> date;
        if(date > 0 && date < 32){
            break;
        }
        else{
            std::cout << "Error, please enter today's date (as an integer):" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }
 }

从检查cin.fail() 这就是获得无限循环的方式:当std::cin >> date失败时, date可能保持不变。 因此,您可以有效地做到这一点:

do
{
    if (date > 0 && date < 32)
    {
        break;
    }
    std::cout << "Error: Please enter todays date: (as an integer) ";
}
while (true);

看起来当std::cin>>a遇到小数点时,它停止接受进一步的输入。 剩下的数字保留在输入缓冲区中。

int a,b,c;

std::cin>>a;
std::cin>>b;
std::cin>>c;

如果用户输入1.9 ,则第一步中a变为1.9保留在输入缓冲区中。 下一个std::cin语句跳过输入,因为输入缓冲区中的第一个字符是小数点。 当采用浮点输入时,将清除缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM