在C编程语言中,诸如"2147483649"
之类的字符串作为int溢出,因为最大的unsigned int是2147483647
。当我想将整数字符串转换为int
时,如何检查这些溢出情况?
我无法检查它是>=-(2^32-1)
还是<= (2^32-1)
,因为将此字符串转换为int
(例如atoi()
)的过程已经更改了此值。是否有一种简单的方法,而不是在转换之前检查字符串的位数,以及每次检查每个数字以确保它在int
s的范围内?
答案 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_MAX
或errno
并设置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}}