c++ - std::stoul 不抛出 std::out_of_range
问题描述
考虑以下代码:
#include <iostream>
#include <cstring>
#include <cerrno>
int main() {
unsigned long num = strtoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", NULL, 16);
std::cout << std::strerror(errno) << "\n";
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF");
std::stoul("hello world");
return 0;
}
此代码预计会从 strerror 打印一些“超出范围”,然后根据文档抛出 out_of_range 异常。它永远不应该到达最后一条斯托尔线。
在实践中,它不会抛出第二个 stoul 语句。我已经尝试过 GCC 4.8.5 和 MinGW 8.2.0,两者都未能抛出 out_of_range 异常,并且只在最后一个 stoul 语句中传递了 invalid_argument。
这是应该报告的错误还是我遗漏了什么,这是预期的行为?
解决方案
默认基数为std::stoul
10。
stoul
读取0
,x
无效,因此忽略字符串的其余部分并返回数值0
。
使用与中类似的语法strtoul
:
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 16);
或自动扣除数字基数:
unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", nullptr, 0);
以上两个版本都会抛出。在线查看!
推荐阅读
- php - 登录后空白页面
- database - 需要在 Oracle 12c 中清理 users01.dbf
- spring - Spring 集成:在 http 出站网关中将 json 作为请求正文和标头发送
- javascript - 对功能性反应中的某种实践感到困惑
- swift - 仅当令牌不为零时如何执行segue swift 5
- python-3.x - Python从数据框列中提取未知字符串
- ios - LLDB 如何在 OC 中使用文件定义的宏
- sql-server - 使用另一个表中的列名来定义新表的名称
- html - 如何在Angular Project中调用浏览器后退按钮
- sql - 连接方法上的 SQL Server 性能