在C中从字符串更改为int时溢出

时间:2017-01-26 08:36:04

标签: c string int

在C编程语言中,诸如"2147483649"之类的字符串作为int溢出,因为最大的unsigned int是2147483647。当我想将整数字符串转换为int时,如何检查这些溢出情况?

我无法检查它是>=-(2^32-1)还是<= (2^32-1),因为将此字符串转换为int(例如atoi())的过程已经更改了此值。是否有一种简单的方法,而不是在转换之前检查字符串的位数,以及每次检查每个数字以确保它在int s的范围内?

4 个答案:

答案 0 :(得分:5)

您可以将生成的整数转换回字符串,并将其与源字符串进行比较。虽然它看起来并不优雅。 : - )

答案 1 :(得分:3)

对无法表示为整数的值使用atoi()会调用未定义的行为。即你不应该使用atoi()

相反,您可以使用strtol()

#include <stdlib.h>
#include <errno.h>

long val = strtol("2147483649", 0, 10);
if (val == LONG_MIN && errno == ERANGE) {
    …underflow…
} else if (val == LONG_MAX && errno == ERANGE) {
    …overflow…
}

答案 2 :(得分:0)

使用strtol()。它会为您提供long,因此如果您的平台上的int大于long,则可以检查是否有溢出。如果字符串中的数字甚至不适合LONG_MIN,则函数将返回特殊值LONG_MAXerrno并设置injectClasses

答案 3 :(得分:0)

如果您正在实施自己的int value = 0; for-each digit-character in string int newValue = value + ( 10 * place * digit-character ) if newValue < value then die("overflow detected") value = newValue next 功能,可以在累积结果时检查溢出:

{{1}}