strtol()返回了一个错误的值。

8

我这里有一个奇怪的问题。当我传入以下字符串时,strtol、atol和atoi都返回了一个不正确的值:

long test = strtol("3087663490", &p, 10);

根据我的调试器,它返回2147483647。我完全被难住了。有什么建议吗?
4个回答

12

您的值大于有符号long类型所能表示的范围。请尝试:

unsigned long test = strtoul("3087663490", &p, 10);

由于它是LONG_MAX或0x7FFFFFFF,所以您得到了2147483647。


11

正确地测试strtol()函数的错误是有些棘手的。您需要类似下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

int main()
{
    char *n = "3087663490";
    char *p;
    long test;

    errno = 0;
    test = strtol(n, &p, 10);

    if (p == n)
        printf("No digits found.\n");
    else if ((test == LONG_MIN || test == LONG_MAX) && errno == ERANGE)
        printf("Value out of range.\n");
    else
        printf("Value is %ld\n", test);

    return 0;
}

运行结果显示你的问题是 值超出范围。 使用更宽的类型,比如 long long(和strtoll())。


4

看起来在您的系统上,long 是一个32位类型。如果是这样的话,3087663490LONG_MAX 还要大。从strtol(3) man page中得知:

如果发生溢出,strtol() 将返回 LONG_MAX

您需要使用无符号类型来表示该数字:

unsigned long test = strtoul("3087663490", &p, 10);

应该可以正常工作。

或者,使用 long long 类型和 strtoll() 函数。 - caf

0

从 strtol 返回后,请检查 p 的值。我相信,如果超过了大小限制,返回值将是 LONG_MAX,并且指针仍将指向数字而不是空格或文本。

并且在检查后,我还看到 errno 将被设置为 ERANGE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接