假设我有一个十进制数字文件,其中应该是适合int
的值,但我想以编程方式验证此文件的内容以检查溢出。有没有一种简单的方法可以检查是否有任何数字会超过整数?
实施例。档案 -
name: test.txt
value: 4343214321423142314
如果我要循环并执行fscanf(fd, "%d", &myint)
,我们将返回成功的指示,但存储在myint中的数字将是不正确的。
同样,如果我将其读入字符数组fscanf(fd, "%s", &mystr)
并盲目地调用atoi(mystr)
,它将返回成功,但结果不正确。
考虑到将其读入字符串的第二个例子,可以执行以下操作:
char buf[11] = {'\0'};
sprintf(buf, "%d", INT_MAX);
fscanf(fd, "%s", &mystr);
if(strcmp(mystr, buf) > 0)
// handle error case
但是有没有更简单的方法来执行此操作而无需额外的数组和字符串比较功能?
答案 0 :(得分:2)
也许您可以将整数读入字符串,然后使用strtol
。然后根据结果的类型有两个解决方案:
long
:如果它返回LONG_MIN
或LONG_MAX
,您可以针对值errno
检查ERANGE
以查看该数字是否溢出; int
:如果它返回的数字大于INT_MIN
或小于INT_MAX
,您可以安全地将您的号码放在int
变量中。答案 1 :(得分:2)
为什么不使用
fscanf(fd, "%d%n%c", &myInt, &pos, &nextChar);
然后检查pos
是否符合预期,下一个字符不是数字?
答案 2 :(得分:1)
答案 3 :(得分:1)
根据scanf(3)手册页,如果errno
设置为
ERANGE
整数转换的结果将超过可以存储在相应整数类型中的大小。
在你的情况下。因此,我只需检查scanf
或fscanf
的结果并使用errno
。