atoi和atof不检查错误、遇非法字符即停、空指针/空字符串行为未定义;推荐用std::stoi/stod(异常+位置反馈)或C++17的std::from_chars(零开销+错误码)。
atoi 和 atof 是 C 标准库()中用于将 C 风格字符串(const char*)转为整数和浮点数的函数。它们不进行错误检查,遇到非法字符就立刻停止解析,且对空指针或空字符串行为未定义(实际常导致崩溃或返回 0)。
atoi("123abc") 返回 123,静默忽略 "abc"
atof(" -45.67e2") 返回 -4567.0,能处理空格、符号、科学计数法atoi("") 或 atoi(nullptr) 是未定义行为,不能依赖返回值errno,无法区分 “0”、“0x0”、“abc” 这些都返回 0 的情况C++11 起推荐用 std::stoi 和 std::stod(在 中),它们接受 std::string,支持异常报告,并能返回解析结束位置。
char buf[] = "42hello";
std::string s(buf);
try {
size_t pos;
int i = std::stoi(s, &pos); // i == 42, pos == 2
if (pos != s.length()) {
// 有未解析的尾部,如 "hello"
}
} catch (const std::invalid_argument&) {
// 输入根本不是数字,如 "xyz"
} catch (const std::out_of_range&) {
// 溢出,如 "999999999999999999999"
}
std::string,空字符串会抛 std::invalid_argument
&pos 参数可选,但强烈建议使用,否则无法知道是否全串被成功解析std::string(或用 std::string_view + C++17 后的 std::from_chars)如果字符数组已知长度、追求零分配和无异常,std::from_chars 是最优解。它工作在原始内存上,不构造对象,也不抛异常,只通过返回码指示结果。
#includechar buf[] = "12345.6789end"; int i; auto [p, ec] = std::from_chars(buf, buf + 5, i); // 解析前5字符 if (ec == std::errc{}) { // 成功,i == 12345,p 指向 buf+5 } else if (ec == std::errc::invalid_argument) { // 无有效数字 } else if (ec == std::errc::result_out_of_range) { // 溢出 }
stoi 可设 base=16,from_chars 不行)std::from_chars(..., double&),但不支持科学计数法("1e3" 会被截断)
直接把 std::vector 或局部 char buf[32] 的 .data() / 数组名传给 atoi,却忘了确保末尾有 '\0',会导致越界读取。
char buf[4] = {'1','2','3'}; —— buf[3] 未初始化,atoi(buf) 行为未定义std::vector v = {'4','5','6'}; —— v.data() 没有结尾 '\0',不能直接喂给 atoi
atoi 解析用户输入或配置文件内容,结果是 0 却不检查是否真为零值还是解析失败std::stoi 而没做 noexcept 替代设计字符数组转数字这件事,关键不在“怎么转”,而在“怎么确认转对了”。atoi/atof 的静默失败特性,在现代 C++ 工程里基本只该出现在兼容旧代码或极端性能敏感的内联汇编边界处。
# c++
# 配置文件
# 标准库
# String
# const
# 字符串
# errno
# char
# double
# 风格字符串
# 指针
# 空指针
# 对象
# 空字符串
# 也不
# 都不
# 浮点
# 出现在
# 而在
# 这件事
# 可选
# 高性能
# 但不
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置夜间模式_Windows11显示设置蓝光过滤强度
Windows10如何更改任务栏高度_Win10解除锁定调整大小
Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】
Go 中 := 短变量声明的类型推导机制详解
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
MySQL 中使用 IF 和 CASE 实现查询字段条件化显示
如何在Golang中捕获HTTP服务器错误_GolangHTTP Handler中error处理
php错误怎么开启_display_errors与log_errors的设置【汇总】
c++中explicit(bool)的用法 c++条件性explicit【C++20】
C++中引用和指针有什么区别?(代码说明)
c# 如何深拷贝和浅拷贝
如何高效获取循环末次生成的 NumPy 数组最后一个元素(无需额外循环)
Windows10如何重置此电脑_Windows10电脑重置方法【步骤】
Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】
Win10怎么卸载剪映_Win10彻底卸载剪映方法【步骤】
Win11怎么设置默认输入法 Win11固定中文输入法【步骤】
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式
Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】
c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】
Win11怎么更改任务栏颜色_Windows11个性化重音色设置
如何在 Go 中调用动态链接库(.so)中的函数
Python对象比较与排序_集合使用说明【指导】
php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】
如何在 Go 中可靠地测试含 time.Time 字段的结构体
如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Win11时间不对怎么同步_Win11自动校准互联网时间【设置】
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
Win10系统怎么查看网络连接状态_Windows10网络和共享中心
Win11任务栏怎么放到顶部_Win11修改任务栏位置方法【详细】
Python文本编码与解码_跨平台解析说明【指导】
Win11快速助手怎么用_Win11远程协助连接教程【工具】
mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】
Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】
Win10怎么卸载鲁大师_Win10彻底卸载鲁大师方法【步骤】
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
MySQL 中使用 IF 和 CASE 实现查询字段的条件转换
Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值
Windows11怎样开启游戏模式_Windows11游戏模式开启攻略【方法】
Python对象生命周期管理_创建销毁说明【指导】
Win11关机快捷键是什么_Win11快速关机方法【大全】
Win10怎样清理C盘阿里旺旺缓存_Win10清理阿里旺旺缓存步骤【步骤】
Win11怎样安装剪映专业版_Win11安装剪映教程【步骤】
如何使用Golang实现容器自动化运维_Golang Docker运维管理方法
PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】
C++如何使用std::async进行异步编程?(future用法)
Win11怎么设置默认邮件应用_Windows11应用关联Mail设置
php8.4xdebug无法调试怎么办_php8.4xdebug配置问题解决【解答】
Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。