17370845950

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

stoistod 是 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=42pos=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.718pos=5
  • 空串、格式错误抛 std::invalid_argument;超出 double 表示范围抛 std::out_of_range
  • 注意:它不接受纯整数字符串带小数点以外的格式(如逗号分隔符),也不处理本地化格式(如 "1,234.56")

异常处理与健壮写法

生产代码中不能假设输入一定合法,应捕获异常并做降级处理(如设默认值、记录日志或提示用户)。

  • 简单容错示例: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
  • 所有这些函数都定义在 头文件中,无需额外链接