推荐使用 std::stoi 进行 string 到 int 的转换,简洁高效且自动跳过空白、按十进制解析;需完整解析校验或混合类型读取时用 std::stringstream 并检查 fail() 和 eof();避免使用 atoi 等 C 风格函数。

在C++中,将 std::string 转换为整数(int)最常用、推荐的方式是使用 std::stoi;而 std::stringstream 更适合需要灵活控制或处理复杂格式的场景。两者各有适用边界,选错可能引发异常或隐式截断。
用 stoi 转 string 到 int(推荐日常使用)
std::stoi 简洁高效,直接抛异常处理错误,适合大多数明确输入格式的场景。它会自动跳过开头空白,按十进制解析,遇到非法字符即停止,并返回已解析部分。
- 基本用法:
int n = std::stoi("123"); - 支持指定进制:
std::stoi("ff", nullptr, 16)→ 255 - 可获取解析结束位置:
size_t pos; int n = std::stoi(s, &pos);,之后可用pos检查是否全字符串都被成功解析(如pos == s.length()) - 注意:输入为空、纯空格、超出
int表示范围时会抛std::invalid_argument或std::out_of_range,务必用try-catch包裹
用 stringstream 转 string 到 int(适合容错或混合解析)
std::stringstream 更底层、更可控,适合需要“尝试读取+判断是否读完”或同时解析多个类型(如 "123 abc 45")的场合。它不抛异常(默认模式),而是通过流状态位判断成败。
- 基础写法:
std::stringstream ss("456"); int n; ss >> n; - 检查是否成功:
if (ss.fail() || !ss.eof()) { /* 解析失败或未读完 */ } - 可链式读取:
ss >> n >> str >> f;,适合结构化字符串 - 默认按空格分隔,支持自定义格式(如用
std::hex读十六进制) - 缺点:代码稍长,性能略低于
stoi,且容易忽略fail()或eof()检查导致静默失败
其他方法对比与避坑提醒
不推荐使用 C 风格函数(如 atoi、strtol),它们不抛异常、不报告错误位置、不支持 std::string 直接传参(需 c_str()),且 atoi 对非法输入返回 0,无法区分 “0” 和 “解析失败”。
立即学习“C++免费学习笔记(深入)”;
-
atoi(s.c_str()):无错误提示,已废弃,避免使用 -
std::strtol(s.c_str(), &end, 10):功能强但接口繁琐,C++项目中优先用stoi或stringstream - 所有方法都假设输入是合法数字字符串;若含前导/后缀非数字字符(如 "-123abc"),
stoi取前段(-123),stringstream默认也只读到 'a' 前,需配合eof()才能识别“未完全消费”
一句话总结怎么选
单次简单转换、输入可信 → 用 std::stoi,加 try/catch;需校验是否完整解析、或后续还要读其它字段 → 用 std::stringstream 并检查 fail() 和 eof();不要用 atoi。










