为什么strtol()对于C中的非常大的数字返回-1?
例如:
Foreach($obj['feed']['results'] as $cltn){
Echo $cltn['collectionName'];
}
答案 0 :(得分:3)
为什么strtol()对于C中的非常大的数字返回-1?
由于使用了错误的打印说明符/变量组合,因此代码行为异常。这是未定义的行为。
long long i = .... printf("i = %d\n", i);
应该发出警告,并启用警告功能。节省时间并启用所有警告。
使用匹配的打印说明符/变量:@Jonathan Leffler @Ian Abbott
long long i = ....
...
// vvv
printf("i = %lld\n", i);
使用strtoll()
将字符串转换为long long
int main() {
// long long i = strtol("1358...
long long i = strtoll("135898539853985649864867468746876587784760", NULL, 10);
// printf("i = %d\n", i);
printf("i = %lld\n", i);
return 0;
}
打印errno
的值将指示溢出。测试endptr
会表明是否发生了某些转化。
由于strtoll()
可以将errno
设置为非零值,因此请在函数调用之前将其设置为0,以便在之后很好地评估函数的效果,并且代码没有继承一些较早的非零值
char *endptr;
errno = 0;
long long i = strtoll(some_string, &endptr, 10);
int errnum = errno;
printf("i = %lld\n", i);
if (some_string == endptr) {
puts("No conversion");
} else {
if (errnum == ERANGE) {
puts("Overflow");
} else if (errnum) {
puts("Implementation specific error");
}
}
答案 1 :(得分:2)
实际上,strtol()
返回正确的值LONG_MAX
。您使用了错误的格式字符串-尝试printf("i = %lli\n", i);
。 %d
用于输出普通的int
。