3

假设我有一个十进制数字文件,它应该是可以放入的值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

但是有没有更简单的方法可以做到这一点而不需要额外的数组和字符串比较功能?

4

4 回答 4

2

也许您可以将整数读入字符串,然后使用strtol. 然后,根据结果的类型,您有两种解决方案:

  • long: 如果返回LONG_MINor LONG_MAX,你可以检查errno该值ERANGE是否溢出;
  • int:如果它返回一个大于INT_MIN或小于的数字INT_MAX,您可以安全地将您的数字放入一个int变量中。
于 2012-11-05T14:55:01.137 回答
2

为什么不使用

fscanf(fd, "%d%n%c", &myInt, &pos, &nextChar);

然后检查这pos是您期望的位置,并且下一个字符不是数字?

于 2012-11-05T14:57:24.310 回答
1

是的,使用strtol(); 如果转换由于溢出而失败,它具有明确定义的行为。如果您知道传入的值实际上是无符号的,请使用strtoul().

于 2012-11-05T14:55:35.510 回答
1

根据scanf(3)手册页,转换将失败并errno设置为

ERANGE

整数转换的结果将超过可以存储在相应整数类型中的大小。

在你的情况下。所以我只检查scanfor的结果fscanf并使用errno.

于 2012-11-05T14:55:44.670 回答