如何检查从C++字符串到无符号整数的转换

How to check conversion from C++ string to unsigned int

本文关键字:字符串 无符号整数 转换 C++ 何检查 检查      更新时间:2023-10-16

我需要:

1( 查找我当前系统上的最大无符号 int 值是多少。我没有找到它在限制上。写unsigned int maxUnsInt = 0 - 1;安全吗?我还尝试了返回正确值但编译器显示有关 int 溢出操作的警告unsigned int maxUnsInt = MAX_INT * 2 + 1

2(找到后,检查C++字符串(我知道它仅由数字组成(是否超过了系统上的最大无符号整数值。

我的最终目标是使用 atoi 将字符串转换为无符号 int,当且仅当它是有效的无符号 int。我宁愿只使用标准库。

<limits.h>中应该有一个#define UINT_MAX;我会如果没有,非常惊讶。 否则,它是有保证的那:

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 == '' && end != input.c_str() && v <= UINT_MAX;
}

如果您使用的是 C++11,您也可以使用 std::stoul ,这在溢出的情况下引发std::out_of_range异常。

>numeric_limits对各种数值类型都有限制:

unsigned int maxUnsInt = std::numeric_limits<unsigned int>::max();

stringstream可以将字符串读入支持 operator>> 的任何类型,并告诉您它是否失败:

std::stringstream ss("1234567890123456789012345678901234567890");
unsigned int value;
ss >> value;
bool successful = !ss.fail();

根据这个你不需要计算它,只需使用适当的常量,在这种情况下应该UINT_MAX

很少有笔记。

与 c++ 相比,这似乎更像是一种 c 方式,但既然你说你想使用 atol我坚持下去。 C++将按照Joachim的建议使用numeric_limits。但是,c++标准也定义了类似c的宏/定义,因此使用起来应该是安全的。

此外,如果您希望它是 c++ 方式,则可能最好使用 stringstream(这是标准 c++ 库的一部分(进行转换。

最后,我故意不发布明确的代码解决方案,因为它看起来像家庭作业,你现在应该很好从这里开始。