c++ atoi和atof函数用法_c++字符数组转数字

发布时间 - 2026-01-01 00:00:00    点击率:
atoi和atof不检查错误、遇非法字符即停、空指针/空字符串行为未定义;推荐用std::stoi/stod(异常+位置反馈)或C++17的std::from_chars(零开销+错误码)。

atoi 和 atof 的基本行为与限制

atoiatof 是 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::stoistd::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 是最优解。它工作在原始内存上,不构造对象,也不抛异常,只通过返回码指示结果。

#include 
char 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)配置教程