c++中如何将字符串转换为整数_c++ string转int方法【详解】
发布时间 - 2026-01-29 00:00:00 点击率:次最稳妥用std::stoi但需处理异常;std::strtol更可控,支持全匹配检查和进制指定;手写解析适用于无异常环境或定制规则;注意locale影响及双重溢出检查。
直接用 std::stoi 最稳妥,但必须处理异常;手写解析或 std::strtol 更可控,尤其面对非法输入、溢出或前导空格时。
std::stoi 适合简单场景,但不捕获细节错误
std::stoi 是最常用的转换函数,语法简洁:
std::string s = "123"; int n = std::stoi(s);
但它有三个关键限制:
- 遇到非数字字符(如
"123abc")会截断转换,返回123,不报错 - 超出
int范围时抛出std::out_of_range异常,不区分上溢/下溢 - 对空字符串、纯空格或只有符号(如
"+")直接抛std::invalid_argument
若业务要求“严格全匹配”,需额外检查转换后是否消耗了整个字符串:
size_t pos;
int n = std::stoi(s, &pos);
if (pos != s.length()) {
// 有未解析的尾部字符,视为失败
}std::strtol 更健壮,能精确控制解析行为
std::strtol 是 C 风格函数,但 C++ 中仍推荐用于需要精细控制的场景。它返回 long,支持指定进制,并通过 endptr 指示解析终点:
const char* cstr = s.c_str();char* endptr; long val = std::strtol(cstr, &endptr, 10);
使用时注意:
-
endptr == cstr表示一个有效数字都没识别到(如空串、纯空格) -
*endptr != '\0'表示存在尾部非法字符(如"42x") - 需手动检查
val是否在INT_MIN~INT_MAX内,再转为int,否则可能静默溢出 - 支持进制参数:
std::strtol("ff", nullptr, 16)→255
手写解析适用于嵌入式、无异常环境或自定义规则
当不能依赖 STL 异常,或需跳过前导空格、接受 '_' 分隔符、限制位数等定制逻辑时,手写更可靠。核心逻辑包括:
- 跳过开头空白(
std::isspace) - 记录符号位,移动指针
- 逐字符判断
c >= '0' && c ,累加:num = num * 10 + (c - '0') - 每步检查溢出:
if (num > (INT_MAX - digit) / 10) - 最后乘符号返回
优点是零依赖、可预测、易调试;缺点是代码量略增,需覆盖所有边界(如 "-2147483648" 这种恰好等于 INT_MIN 的情况)。
别忽略 locale 和编码问题
std::stoi 和 std::strtol 都依赖当前 C locale 的数字识别规则。默认 "C" locale 下只认 ASCII 数字 '0'–'9';若程序切换过 locale(如设为 "zh_CN.UTF-8"),某些实现可能影响解析行为——尽管实践中极少遇到非 ASCII 数字参与转换,但仍建议显式保持 C locale:
std::locale::global(std::locale("C"));或者更安全的做法:始终用 .c_str() 提供的 ASCII 字节流调用 strtol,避免 string 内容含多字节 UTF-8 数字(这本身就不符合常规整数表示)。
真正容易被忽略的是:溢出检查必须做两次——一次在 strtol 后判断范围,一次在赋值给 int 前确认值有效;而 stoi 的异常只告诉你“错了”,不告诉你错在哪一环。
# git
# 编码
# 字节
# c++
# String
# 字符串
# int
# 指针
# ASCII
# 适用于
# 多字
# 跳过
# 上溢
# 的是
# 就不
# 都没
# 告诉你
# 设为
# 两次
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何快速搭建自助建站会员专属系统?
如何快速生成凡客建站的专业级图册?
如何正确下载安装西数主机建站助手?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
如何在橙子建站上传落地页?操作指南详解
如何实现建站之星域名转发设置?
Python并发异常传播_错误处理解析【教程】
移动端脚本框架Hammer.js
如何在万网自助建站中设置域名及备案?
昵图网官网入口 昵图网素材平台官方入口
Linux系统运维自动化项目教程_Ansible批量管理实战
如何快速上传自定义模板至建站之星?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何在阿里云虚拟服务器快速搭建网站?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
北京企业网站设计制作公司,北京铁路集团官方网站?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel怎么调用外部API_Laravel Http Client客户端使用
如何快速生成橙子建站落地页链接?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
js代码实现下拉菜单【推荐】
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
MySQL查询结果复制到新表的方法(更新、插入)
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
香港服务器如何优化才能显著提升网站加载速度?
如何快速搭建安全的FTP站点?
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何在阿里云ECS服务器部署织梦CMS网站?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何在阿里云域名上完成建站全流程?
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何快速搭建高效服务器建站系统?
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何在阿里云完成域名注册与建站?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
Laravel如何配置和使用缓存?(Redis代码示例)
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
jQuery中的100个技巧汇总
大同网页,大同瑞慈医院官网?


