如何检查从C++字符串到无符号整数的转换
How to check conversion from C++ string to unsigned int
我需要:
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++ 库的一部分(进行转换。
最后,我故意不发布明确的代码解决方案,因为它看起来像家庭作业,你现在应该很好从这里开始。
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数
- 如何安全地比较两个无符号整数计数器?
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- 字符串下标超出范围.我不知道如何使用字符索引数组,所以我使用了(无符号整数),但它不起作用
- c++中从字符串生成唯一无符号整数的最佳方法是什么?
- 如何检查从C++字符串到无符号整数的转换