为什么strtol()对于很大的数字返回-1?

时间:2018-06-25 16:35:25

标签: c type-conversion strtol

为什么strtol()对于C中的非常大的数字返回-1?

例如:

Foreach($obj['feed']['results'] as $cltn){
    Echo $cltn['collectionName'];
}

2 个答案:

答案 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