如何检查十进制数是否处于32位无符号整数uint32_t的取值范围内
C++参数校验实现方案
你可以通过标准库转换接口配合范围校验实现需求,核心实现逻辑如下:
- 第一步先校验入参存在性:判断
argc >= 2,未传入有效argv[1]直接返回错误码1 - 第二步调用
std::stoul将字符串转换为无符号长整型,过程中捕获两类异常,捕获到任意一类直接返回错误码1:- 输入含非十进制数字字符时抛出的
std::invalid_argument异常 - 转换结果超出
unsigned long取值范围时抛出的std::out_of_range异常
- 输入含非十进制数字字符时抛出的
- 第三步对转换结果做范围校验:如果数值等于0,或者数值大于
UINT32_MAX(定义在<cstdint>头文件中,固定值为4294967295),返回错误码1 - 所有校验通过后即可将数值强转为
uint32_t用于后续业务逻辑
参考实现代码:
#include <iostream> #include <string> #include <cstdint> #include <stdexcept> int main(int argc, char* argv[]) { // 校验入参是否存在 if (argc < 2) { return 1; } unsigned long input_num; try { input_num = std::stoul(argv[1]); } catch (const std::invalid_argument&) { // 输入包含非十进制数字字符 return 1; } catch (const std::out_of_range&) { // 数值超出unsigned long范围,必然不符合uint32_t要求 return 1; } // 校验是否在要求的合法范围内 if (input_num == 0 || input_num > UINT32_MAX) { return 1; } // 校验通过,后续业务逻辑 uint32_t valid_num = static_cast<uint32_t>(input_num); std::cout << "合法输入值:" << valid_num << std::endl; return 0; }
如果你不想依赖异常处理,也可以用纯字符串校验的方式实现:
- 先判断输入字符串长度:长度大于10位直接判定非法(4294967295为10位十进制数);长度为10位时直接和字符串
"4294967295"做字典序比较,大于该字符串则判定非法 - 逐字符遍历输入字符串,确认每个字符都属于
0-9的十进制数字范围 - 转换为数值后判断是否等于0,等于0则返回错误码1
- 所有校验通过后即可使用该数值
内容的提问来源于stack exchange,提问作者Chiller
相关产品推荐
相关产品推荐

