gpt4 book ai didi

比较 INT_MAX 和 long 给出错误的结果

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:15 25 4
gpt4 key购买 nike

我从用户输入中得到 long(使用 fgets() 并使用 strtoul() 转换为 long),但是在测试它以转换为整数时给出错误的结果.

声明:

char buf[BUFSIZE];
unsigned char input[80];
int done = 0;
int i, val;
long valPrimary;
char *ptr;

代码:

 // gets the max first 79 characters, whichever comes first
if (fgets(input, INPUTSIZE, stdin) != NULL) {
printf("Input ok\n");
} else {
printf("Input not ok\n");
return 0;
}

// get unsigned long from input
valPrimary = strtoul(input, &ptr, 10);

// Check if any character was converted
if (ptr == input) {
fprintf(stderr, "Can't convert string to number\n");
return 0;
}

if ((valPrimary == LONG_MAX || valPrimary == LONG_MIN) && errno== ERANGE) {
fprintf(stderr, "Number out of range for LONG\n");
return 0;
}
printf("valPrimary: %lu\n", valPrimary);
printf("Max Int: %i\n", INT_MAX);
printf("Min Int: %i\n", INT_MIN);
printf("Long size: %lu\n", sizeof(long));

// Check overflows and if long is convertable to int
if ( (valPrimary > INT_MAX) || (valPrimary < INT_MIN) ) {
fprintf(stderr, "Number out of range for INT\n");
return 0;
} else {
val = (int) valPrimary;
}

例如,如果我输入一些非常大的数字,我会得到这种标准输出:

valPrimary: 18446744073709551615

Max Int: 2147483647

但是没有显示错误信息,转换仍然发生。

最佳答案

signed longstrtoul() 的不正确混合。使用 strtol()@Quentin
strtoul("18446744073709551615",...) --> ULONG_MAX 转换为 long 可能变成 -1.

long valPrimary;
...
// valPrimary = strtoul(input, &ptr, 10);
valPrimary = strtol(input, &ptr, 10);
...
if ((valPrimary == LONG_MAX || valPrimary == LONG_MIN) && errno== ERANGE) {
fprintf(stderr, "Number out of range for LONG\n");

关于比较 INT_MAX 和 long 给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593240/

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