#include<limits.h>
#include<errno.h>
long output;
errno = 0;
output = strtol(input,NULL,10);
printf("long max = %ld\n",LONG_MAX);
printf("input = %s\n",input);
printf("output = %ld\n",output);
printf("direct call = %ld\n",strtol(input,NULL,10));
if(errno || output >= INT_MAX || output <= INT_MIN) {
printf("Input was out of range of int, INT_MIN = %d, INT_MAX = %d\n",INT_MIN,INT_MAX);
printf("Please input an integer within the allowed range:\n");
}
当上面的代码被输入{1','2','3','4','5','6','7','8','9','0','1'}
我得到一个输出:
long max = 9223372036854775807
input = 12345678901
output = -539222987
direct call = 3755744309
怎么回事。。。strtol似乎有溢出问题,但没有设置errno
最佳答案
您很可能没有包含必需的<stdio.h>
和/或<stdlib.h>
标题。
一旦包含以下内容,您的代码就可以正常工作(64位模式下为GCC):
$ cat t.c
#include<limits.h>
#include<errno.h>
#include<stdlib.h>
#include<stdio.h>
int main (void)
{
long output;
char input[] = "12345678901";
errno = 0;
output = strtol(input,NULL,10);
printf("long max = %ld\n",LONG_MAX);
printf("input = %s\n",input);
printf("output = %ld\n",output);
printf("direct call = %ld\n",strtol(input,NULL,10));
if(errno || output >= INT_MAX || output <= INT_MIN) {
printf("Input was out of range of int, INT_MIN = %d, INT_MAX = %d\n",INT_MIN,INT_MAX);
printf("Please input an integer within the allowed range:\n");
}
return 0;
}
$ gcc -Wall -Wextra -pedantic t.c
$ ./a.out
long max = 9223372036854775807
input = 12345678901
output = 12345678901
direct call = 12345678901
Input was out of range of int, INT_MIN = -2147483648, INT_MAX = 2147483647
Please input an integer within the allowed range:
顺便说一下,您应该在
errno
调用之后立即保存strtol
,您在strtol
和条件之间调用的库函数可能会更改其值。关于c - strtol行为不符合预期,c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7940399/