gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:46:40 28 4
gpt4 key购买 nike

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

例如:

#include <stdio.h>
#include <string.h>
int main() {
long long i = strtoll("135898539853985649864867468746876587784760", NULL, 10);
printf("i = %lld\n", i);
return 0;
}

最佳答案

Why strtol() returns -1 for very large numbers in C?

由于使用了错误的打印说明符/变量组合,代码行为异常。这是未定义的行为

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");
}
}

关于c - 为什么 strtol() 对于非常大的数字返回 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51028118/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com