stoi和stod是C++11起最常用、最简洁的字符串转数字方法,支持自动跳过前导空白、正负号、进制(stoi)和科学计数法(stod),出错时抛异常,比atoi/atof更安全可控。

用 stoi 和 stod 是 C++11 起最常用、最简洁的字符串转数字方法,它们直接处理 std::string,自动跳过前导空白,支持正负号和进制(stoi 可指定),出错时抛异常,比老式 atoi / atof 更安全可控。
stoi:转整数(int)
stoi 把字符串解析为 int 类型。它会忽略开头的空格,读取可选的正负号,然后尽可能多地读取十进制数字(默认),直到遇到非法字符或结尾为止。
- 基本用法:
int n = stoi("123");→ 得到123 - 支持进制参数:
stoi("1010", nullptr, 2)→ 解析二进制,结果为10 - 获取解析结束位置(可选):
size_t pos; int x = stoi("42abc", &pos);→x=42,pos=2(指向 'a') - 非法输入(如空串、纯非数字)会抛
std::invalid_argument;溢出则抛std::out_of_range
stod:转浮点数(double)
stod 用于将字符串转为 double,支持科学计数法(如 "3.14"、"2e-3"、"-1.5E+2"),同样跳过前导空格,停在第一个无法识别的字符处。
- 基础调用:
double d = stod("3.14159"); - 获取结束位置:
size_t pos; double y = stod("2.718abc", &pos);→y=2.718,pos=5 - 空串、格式错误抛
std::invalid_argument;超出double表示范围抛std::out_of_range - 注意:它不接受纯整数字符串带小数点以外的格式(如逗号分隔符),也不处理本地化格式(如 "1,234.56")
异常处理与健壮写法
生产代码中不能假设输入一定合法,应捕获异常并做降级处理(如设默认值、记录日志或提示用户)。
立即学习“C++免费学习笔记(深入)”;
- 简单容错示例:try { int x = stoi(s); } catch (const std::invalid_argument&) { x = 0; }
- 区分错误类型更精准:
catch (const std::out_of_range&)表示数值太大/小,catch (const std::invalid_argument&)表示根本不是数字格式 - 若需检查是否“完全转换”,可用
pos判断:转换后pos == s.length()才说明整个字符串都被成功解析
其他类似函数(按需选用)
C++ 还提供 stol(long)、stoll(long long)、stoul(unsigned long)、stof(float)等,接口一致,仅返回类型不同。
- 需要更大整数范围?用
stoll替代stoi - 只要单精度浮点?用
stof,性能略优,但精度和范围不如stod - 所有这些函数都定义在
头文件中,无需额外链接










