【问题标题】:Negative number error while checking proper input of unsigned long long检查 unsigned long long 的正确输入时出现负数错误
【发布时间】:2017-11-05 15:06:53
【问题描述】:

我需要检查输入是否正确,比如抛出一些错误的输入,如'b'、-2等。这是我的简单代码,如何检查:

#include <stdio.h>

int main()
{
    unsigned long long bigNumber;
    if(scanf("%llu", &bigNumber) == 0)
        printf("Input error!");
    else
        printf("%llu\n", bigNumber);

    return 0;
}

但是当我输入时

-2

我得到了这个输出:

18446744073709551614

这是错误的,因为 -2 不是 unsigned long long。

当我试图改变输入条件时

if((scanf("%llu", &bigNumber) == 0) || (bigNumber < 0))

令人惊讶的是,我得到了一个编译错误:

ex.c:6:52: error: comparison of unsigned expression < 0 is always false
      [-Werror,-Wtautological-compare]
        if((scanf("%llu", &bigNumber) == 0) || (bigNumber < 0))
                                                ~~~~~~~~~ ^ ~
1 error generated.

那么,如果必须是 0 - 10^19 之间的整数,我该如何正确检查我的大数?

【问题讨论】:

  • 输入为字符串(如fgets)然后检查它是否以-开头然后sscanfstrtoull

标签: c scanf unsigned-long-long-int


【解决方案1】:

在 C99 标准中,输入值减号是可选的,因此如果读取减号,则不会出现错误,结果将是负数的二进制补码,可能是一个非常大的值。 (Wikipedia)

您必须读入一个有符号数并与x &lt; 0 核对,或者在比较之前将读取的无符号值强制转换为有符号数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多