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; // 输出: 123
return 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, 789
return 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; // 输出: 123
std::cout << "未转换部分: " << s.substr(idx) << std::endl; // 输出: abc
return 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; // 输出: 10
std::cout << "十六进制转整数: " << num2 << std::endl; // 输出: 31
return 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 更易用。