c++ atoi和atof函数用法_c++字符数组转数字
技术百科
裘德小鎮的故事
发布时间:2026-01-01
浏览: 次 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,却忘了确保末尾有 '\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
# double
# 标准库
# 指针
# 字符串
# char
# 风格字符串
# 空指针
# 空字符串
# 高性能
# const
# 浮点
# errno
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11系统占用空间大怎么办 Win11深度瘦身
- 如何在 Go 中判断变量是否为函数类型
- php打包exe如何加密代码_防反编译保护方法【技
- LINUX怎么进行文本内容搜索_Linux gre
- mac本地php环境如何开启curl_curl扩展
- 如何在Golang中实现自定义Benchmark_
- php怎么下载安装后设置默认字符集_utf8配置步
- Mac怎么进行语音输入_Mac听写功能设置与使用【
- Win11怎么关闭VBS安全性_Windows11
- 如何在 Go 中正确反序列化多个同级 XML 元素
- Python函数接口稳定性_版本演进解析【指导】
- c++怎么操作redis数据库_c++ hired
- Windows如何拦截腾讯视频广告_Windows
- c++中如何使用std::variant_c++1
- Win11如何关闭游戏模式 Win11禁用Xbox
- 用Python构建微服务架构实践_FastAPI与
- Python邮件系统自动化教程_批量发送解析与模板
- Win11怎么关闭开机声音_Win11系统启动提示
- php嵌入式需要什么环境_搭建php+linux嵌
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Python网络超时处理_健壮性设计说明【指导】
- 如何使用Golang实现微服务状态监控_Golan
- Windows10怎么卸载预装软件_Windows
- Win11怎样安装剪映专业版_Win11安装剪映教
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- 为什么本地php环境运行php脚本卡顿_php执行
- Win11怎么设置默认邮件客户端 Win11修改M
- Python异步网络编程_aiohttp说明【指导
- Windows10系统怎么查看系统版本_Win10
- Win11任务栏颜色怎么改_Win11自定义任务栏
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- php做exe支持多线程吗_并发处理实现方式【详解
- c++ std::atomic如何保证原子性 c+
- Python类装饰器使用_元编程解析【教程】
- Win11怎么设置默认终端应用_Windows11
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- Win11怎么开启剪贴板历史记录_Windows1
- Win11怎么关闭透明效果_Windows11个性
- Python 中将 ISO 8601 时间戳转换为
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- c++如何利用doxygen生成开发文档_c++
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- c++的位运算怎么用 与、或、异或、移位操作详解【
- 如何使用Golang template生成文本模板
- Windows的便笺功能如何使用?(桌面备忘技巧)
- 如何使用Golang实现跨域请求支持_Golang
- Win11如何添加/删除输入法 Win11切换中英
- LINUX如何删除用户和用户组_Linux use
- Win11怎么关闭通知中心_Windows11系统
- Win11怎么更改鼠标指针方案_Windows11

\0'
QQ客服