c++ atoi和atof函数用法_c++字符数组转数字
发布时间 - 2026-01-01 00:00:00 点击率:次atoi和atof不检查错误、遇非法字符即停、空指针/空字符串行为未定义;推荐用std::stoi/stod(异常+位置反馈)或C++17的std::from_chars(零开销+错误码)。
atoi 和 atof 的基本行为与限制
atoi 和 atof 是 C 标准库()中用于将 C 风格字符串(const char*)转为整数和浮点数的函数。它们不进行错误检查,遇到非法字符就立刻停止解析,且对空指针或空字符串行为未定义(实际常导致崩溃或返回 0)。
-
atoi("123abc")返回123,静默忽略"abc" -
atof(" -45.67e2")返回-4567.0,能处理空格、符号、科学计数法 -
atoi("")或atoi(nullptr)是未定义行为,不能依赖返回值 - 两者都不设置
errno,无法区分 “0”、“0x0”、“abc” 这些都返回 0 的情况
替代方案:用 std::stoi / std::stod 更安全
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参数可选,但强烈建议使用,否则无法知道是否全串被成功解析 - 不接受 C 风格字符串直接调用,需先构造
std::string(或用std::string_view+ C++17 后的std::from_chars)
高性能场景:用 std::from_chars(C++17)
如果字符数组已知长度、追求零分配和无异常,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"会被截断) - 要求编译器支持 C++17 且标准库实现完整(GCC 11+/Clang 12+/MSVC 2019 16.8+)
常见误用与踩坑点
直接把 直接把 std::vector 或局部 char buf[32] 的 .data() / 数组名传给 atoi,却忘了确保末尾有 ',会导致越界读取。std::vector 或局部 char buf[32] 的 .data() / 数组名传给 atoi,却忘了确保末尾有 '\0',会导致越界读取。
立即学习“C++免费学习笔记(深入)”;
-
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
# 风格字符串
# 指针
# 空指针
# 对象
# 空字符串
# 也不
# 都不
# 浮点
# 出现在
# 而在
# 这件事
# 数组名
# 可选
# 高性能
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
简单实现Android文件上传
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何用好域名打造高点击率的自主建站?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何快速查询域名建站关键信息?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何快速搭建自助建站会员专属系统?
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
C#如何调用原生C++ COM对象详解
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Android仿QQ列表左滑删除操作
如何在Ubuntu系统下快速搭建WordPress个人网站?
Laravel如何配置和使用缓存?(Redis代码示例)
使用spring连接及操作mongodb3.0实例
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
如何在建站之星网店版论坛获取技术支持?
zabbix利用python脚本发送报警邮件的方法
Python高阶函数应用_函数作为参数说明【指导】
郑州企业网站制作公司,郑州招聘网站有哪些?
公司门户网站制作流程,华为官网怎么做?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何在云指建站中生成FTP站点?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何快速生成凡客建站的专业级图册?
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
如何在宝塔面板创建新站点?
Linux系统命令中tree命令详解
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
打造顶配客厅影院,这份100寸电视推荐名单请查收
Laravel如何生成API文档?(Swagger/OpenAPI教程)
微信小程序 canvas开发实例及注意事项
详解Android——蓝牙技术 带你实现终端间数据传输
如何挑选最适合建站的高性能VPS主机?
如何用狗爹虚拟主机快速搭建网站?
深圳网站制作的公司有哪些,dido官方网站?
想要更高端的建设网站,这些原则一定要坚持!
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
利用vue写todolist单页应用
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程

