应该有一个#define UINT_MAX
in <limits.h>
; 如果没有,我会感到非常惊讶。否则,保证:
unsigned int u = -1;
将导致最大值。在 C++ 中,您也可以使用
std::numeric_limits<unsigned int>::max()
,但在 C++11 之前,这不是一个整数常量表达式(这可能是也可能不是问题)。
unsigned int u = 2 * MAX_INT + 1;
不保证是任何东西(至少在一个系统上
MAX_INT == UMAX_INT
)。
关于检查字符串,最简单的解决方案是使用strtoul
,然后验证errno
和返回值:
bool
isLegalUInt( std::string const& input )
{
char const* end;
errno = 0;
unsigned long v = strtoul( input.c_str(), &end, 10 );
return errno == 0 && *end == '\0' && end != input.c_str() && v <= UINT_MAX;
}
如果您使用的是 C++11,您还可以使用std::stoul
,它会在溢出时引发std::out_of_range
异常。