2011-03-30 126 views
6

我在这里有一个奇怪的。与strtol,蒂和所有的atoi返回不正确的值当我通过下面的字符串:strtol()返回一个不正确的值

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

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

回答

12

您的值大于签名long类型可以表示的值。尝试:

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

(你越来越2147483647,因为它是LONG_MAX或0x7FFFFFFF的)

4

看起来long是您的系统上的32位类型。如果是这种情况,3087663490大于LONG_MAX。从strtol(3) man page

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

你需要使用一个无符号的类型来表示你的机器上的号码:

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

应该正常工作。

+0

..或者一个'long long'类型和'strtoll()'。 – caf 2011-03-31 03:05:21

0

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

而且我在检查后还会看到errno将设置为ERANGE

+0

我相信你对结束指针有误。 – 2011-03-31 00:16:43

7

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())。

相关问题