【问题标题】:How does this snippet validate an integer input?此代码段如何验证整数输入?
【发布时间】:2012-11-28 00:01:50
【问题描述】:

我得到了循环,以及输入 int 类型的初始提示,但是......使用 !(cin >> [variable]) 检查的 while 循环是什么?我在 cplusplus.com 上查看了 cin 以获得解释,但我没有看到它持有任何值......看起来它只是检查输入数字的数值,如何检查有效的整数输入?

int number;
.
.
.
    cout<<"Please enter a number: ";
    while (!(cin >> number))
    {
        cin.clear();
        cin >> badinput;
        cout <<"Input " << badinput << " is invalid, please enter a number: ";
    }

【问题讨论】:

    标签: c++ validation


    【解决方案1】:

    operator &gt;&gt; 在输入流上返回对流的引用,而不是从流中读取的内容。读取的值放入参数引用的内容中,该值必须是左值。

    iostream 上的! 运算符测试流上的失败标志——如果流上出现任何类型的失败,它返回true。对于输入流,如果您尝试读取一个整数(正如这段代码所做的那样)并且输入看起来不像一个整数,则会设置失败标志。

    所以这段代码(尝试)将一个整数读入number,然后测试失败标志。如果设置了,它会清除失败标志,读取badinput(可能是一个字符串),打印消息并循环,尝试读取另一个整数。

    所以只要唯一的失败是格式化,它就会循环直到它得到一个整数。如果还有其他一些更持久的故障(例如,如果 cin 获得 EOF 或关闭),它将永远循环。

    【讨论】:

    • 谢谢!这将有助于我的代码不会在我的作业中爆炸,但我不想使用我不理解的东西:D
    【解决方案2】:

    在我看来,它会检查是否输入了正数。正数将为真,导致!number 为假并跳过循环。如果输入的不是正数,则为假,导致!number为真,进入循环。

    【讨论】:

    • 反对票的评论将有助于避免未来的反对票。
    • @NickD:你的解释是错误的。一个数字是正数还是负数并不代表它是真还是假。按照惯例,0 是假的,除零以外的任何东西都是真。因此,!7 = !-3 = !true = false 和 !0 = !false = true。尝试使用 x 的许多不同值调用此函数,包括 -1、0 和 1:void test(int x) { if(x) { printf("%d: true!\n", x); } if(!x) { printf("%d: false!\n", x); } }
    • @NikBougalis 感谢您的解释,这很有帮助。似乎有些人忘记了这个网站是为了学习而认为每个人都是专家,导致非常屈尊和无益的cmets。
    • @NickD:如果你有问题,你应该把它作为一个问题提出,而不是作为另一个(不相关)问题的答案,并期望人们在 cmets 中澄清事情。您的回答,除了错误之外,基本上与所提出的问题无关。这个网站不是专门用来学习的,它是用来提问和回答在其他地方不容易问和回答的问题。关于编程语言基本语法的问题是边缘性的,因为它们通常通过阅读介绍性文本更好地解决。
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 2022-09-28
    • 1970-01-01
    • 2021-12-11
    • 2012-11-02
    • 2013-05-31
    相关资源
    最近更新 更多