stoi 是 C++ 标准库中的一个函数,定义在头文件 <string>
中,它用于将字符串转换为整数类型。
函数原型
int stoi(const std::string& str, size_t* idx = 0, int base = 10);
-
str(必选):要转换的字符串,必须以数字开头(可以包含正负号)。
插一句题外话
如果不以数字开头,会这样:
-
idx(可选):用来存储解析结束的位置(字符串中第一个非数字字符的索引)。如果不需要这个信息,可以传入 nullptr 或省略。
-
base(可选):数字的进制,默认值为 10(十进制)。支持 2-36 的进制转换(注意是将base指定的进制转换为十进制,后面的常见用法里面会举一个相关的例子)。
功能描述
-
将字符串转换为整数。如果字符串中有非法字符,stoi 会抛出异常。
-
字符串可以包含前导空格和符号(+ 或 -)。
-
转换以第一个非数字字符或字符串末尾结束。
常见用法
1. 基本转换
将字符串转换为整数:
#include <iostream>
#include <string>int main() {std::string s = "123";int num = std::stoi(s);std::cout << "整数值: " << num << std::endl; // 输出: 123return 0;
}
2. 转换含符号的数字
可以处理正负号:
#include <iostream>
#include <string>int main() {std::string s1 = "-456";std::string s2 = "+789";int num1 = std::stoi(s1);int num2 = std::stoi(s2);std::cout << num1 << ", " << num2 << std::endl; // 输出: -456, 789return 0;
}
3. 提取部分字符串
使用 idx 提取未转换的部分:
#include <iostream>
#include <string>int main() {std::string s = "123abc";size_t idx;int num = std::stoi(s, &idx);std::cout << "整数值: " << num << std::endl; // 输出: 123std::cout << "未转换部分: " << s.substr(idx) << std::endl; // 输出: abcreturn 0;
}
4. 转换不同进制的数字
支持其他进制(例如二进制、十六进制等):
#include <iostream>
#include <string>int main() {std::string binary = "1010"; // 二进制字符串std::string hex = "1F"; // 十六进制字符串int num1 = std::stoi(binary, nullptr, 2); // 二进制转换int num2 = std::stoi(hex, nullptr, 16); // 十六进制转换std::cout << "二进制转整数: " << num1 << std::endl; // 输出: 10std::cout << "十六进制转整数: " << num2 << std::endl; // 输出: 31return 0;
}
异常处理
stoi 会抛出以下异常:
-
std::invalid_argument
:当字符串不包含任何数字时(如 "abc")。 -
std::out_of_range
:当结果超出 int 类型的范围。
举个例子
#include <iostream>
#include <string>int main() {try {std::string invalid = "abc";int num = std::stoi(invalid); // 抛出 std::invalid_argument} catch (const std::invalid_argument& e) {std::cout << "无效输入: " << e.what() << std::endl;}try {std::string too_large = "9999999999999999999";int num = std::stoi(too_large); // 抛出 std::out_of_range} catch (const std::out_of_range& e) {std::cout << "超出范围: " << e.what() << std::endl;}return 0;
}
输出如下:
注意事项
-
stoi 只能处理整数。如果需要转换浮点数,使用
std::stof
或std::stod
。 -
stoi 是基于 std::strtol 实现的,但比 std::strtol 更易用。