strtol()返回不正确的值

时间:2011-03-30 22:28:50

标签: c visual-studio-2010 string

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

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

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

4 个答案:

答案 0 :(得分:12)

您的值大于签名的long类型所代表的值。尝试:

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

(你得到2147483647,因为它是LONG_MAX或0x7FFFFFFF)

答案 1 :(得分:9)

正确测试来自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;
}

运行此功能可显示您的问题所在 - Value out of range.。使用更宽泛的类型,例如long long(和strtoll())。

答案 2 :(得分:4)

系统上显示long是32位类型。如果是这种情况,则3087663490大于LONG_MAX。来自strtol(3) man page

  

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

您需要使用无符号类型来表示计算机上的数字:

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

应该可以正常工作。

答案 3 :(得分:0)

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

我还会在检查后errno将设置为ERANGE