【发布时间】:2014-02-09 21:43:37
【问题描述】:
我对 C 比较陌生,想知道如何防止输入溢出...
例如,我有:
scanf("%d", &a);
其中 a 是一个整数。
那么我可以做些什么来防止有人输入大于最大整数的数字?由于我正在处理的问题的限制,您必须使用scanf。如何限制输入?
【问题讨论】:
-
使用
scanf读取一个字符串,然后自己解析? -
理论上您可以查看 errno 是否为 ERANGE 以表示超出范围的错误。但是,这不是为 scanf 指定的标准。请参阅linux.die.net/man/3/scanf
''C89 and C99 and POSIX.1-2001 standards do not specify the ERANGE error ''换句话说,如果您需要读取整数同时还具有检查溢出的能力,则应该使用strtol。 -
如果您必须使用scanf,一种简单的方法是读取
double,而不是使用scanf(范围更大),进行自己的范围检查,然后然后将结果转换为int(如果它符合您的条件)。只要您的有效整数范围不太大,这将不会丢失信息。 -
@Brandin:ANSI-C 规范确实说匹配数字序列,然后使用 strtol 函数进行转换。因此,如果该值长时间过大,您将得到一个 ERANGE。但是,如果它对于 int 来说太大但适合 long ,则尚不清楚会发生什么。