我在这里有一个奇怪的。与strtol,蒂和所有的atoi返回不正确的值当我通过下面的字符串:strtol()返回一个不正确的值
long test = strtol("3087663490", &p, 10);
根据我的调试器,它返回2147483647。我对这个完全难住了。有什么建议?
我在这里有一个奇怪的。与strtol,蒂和所有的atoi返回不正确的值当我通过下面的字符串:strtol()返回一个不正确的值
long test = strtol("3087663490", &p, 10);
根据我的调试器,它返回2147483647。我对这个完全难住了。有什么建议?
您的值大于签名long
类型可以表示的值。尝试:
unsigned long test = strtoul("3087663490", &p, 10);
(你越来越2147483647,因为它是LONG_MAX
或0x7FFFFFFF的)
看起来long
是您的系统上的32位类型。如果是这种情况,3087663490
大于LONG_MAX
。从strtol(3)
man page:
如果发生溢出,
strtol()
回报LONG_MAX
。
你需要使用一个无符号的类型来表示你的机器上的号码:
unsigned long test = strtoul("3087663490", &p, 10);
应该正常工作。
从返回strtol将检查p
值后。我相信如果超过了大小限制,返回值将是LONG_MAX 和指针仍然是指向数字而不是空白或文本的指针。
而且我在检查后还会看到errno
将设置为ERANGE
。
我相信你对结束指针有误。 – 2011-03-31 00:16:43
从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()
)。
..或者一个'long long'类型和'strtoll()'。 – caf 2011-03-31 03:05:21