参考:C++(stoi())
文章目录
在C++中,
stoi()
是一个标准库函数,用于将字符串(
std::string
或 C 风格字符串)转换为整数(
int
)。这个函数定义在
<string>
头文件中。是 C++11 引入的一个标准库函数,用于将字符串转换为整数。与 atoi() 不同,stoi() 提供了更强的功能,包括错误处理、支持指定进制等。
函数原型
int stoi(const std::string& str, std::size_t* idx = nullptr, int base = 10);
参数
str
:要转换的字符串。idx
:一个可选参数,指向std::size_t
类型的指针。如果提供,函数会将转换停止的位置(即第一个不是有效数字的字符的索引)存储在这个指针指向的位置。如果转换失败,idx
将被设置为 0。如果转换成功,但字符串中没有非数字字符,idx
将被设置为字符串的长度。base
:一个可选参数,指定了要转换的字符串的数制(基数)。它必须是2到36之间的整数。如果设置为0,函数会根据字符串的前缀自动确定数制(例如,“0x” 或 “0X” 表示十六进制,“0” 表示八进制)。
返回值
- 返回转换后的整数。
使用示例
示例1:基本使用
#include <iostream>
#include <string>
int main() {
std::string str = "456";
try {
int num = std::stoi(str);
std::cout << "转换结果: " << num << std::endl;
} catch (const std::invalid_argument& e) {
std::cout << "无效的输入: " << e.what() << std::endl;
} catch (const std::out_of_range& e) {
std::cout << "数值超出范围: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,我们只使用了 std::stoi
的第一个参数,将字符串 “456” 转换为整数 456。
示例2:使用 idx
参数
#include <iostream>
#include <string>
int main() {
std::string str = "123abc";
std::size_t idx;
try {
int num = std::stoi(str, &idx);
std::cout << "转换结果: " << num << std::endl;
std::cout << "转换停止位置: " << idx << std::endl;
} catch (const std::invalid_argument& e) {
std::cout << "无效的输入: " << e.what() << std::endl;
} catch (const std::out_of_range& e) {
std::cout << "数值超出范围: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,我们使用了 std::stoi
的第二个参数 idx
,它存储了转换停止的位置,即字符串中 “123” 之后的字符 ‘a’ 的索引。
示例3:使用 base
参数
#include <iostream>
#include <string>
int main() {
std::string str = "1a2";
try {
int num = std::stoi(str, nullptr, 16); // 将字符串视为十六进制数
std::cout << "十六进制转换结果: " << num << std::endl;
} catch (const std::invalid_argument& e) {
std::cout << "无效的输入: " << e.what() << std::endl;
} catch (const std::out_of_range& e) {
std::cout << "数值超出范围: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,我们使用了 std::stoi
的第三个参数 base
,将字符串 “1a2” 视为十六进制数进行转换。
异常
如果转换失败(例如,字符串不包含有效的整数),stoi()
会抛出一个 std::invalid_argument
异常。如果转换后的数字超出了 int
类型的范围,会抛出 std::out_of_range
异常。
注意事项
- 确保字符串只包含有效的数字字符,否则
stoi()
会抛出异常。 - 如果需要处理可能抛出的异常,应该使用
try-catch
块来捕获这些异常。 - 如果输入的字符串不是有效的整数表示,
std::stoi
会抛出std::invalid_argument
异常。 - 如果字符串表示的数值超出了
int
类型的范围,std::stoi
会抛出std::out_of_range
异常。 - 使用
idx
参数时,如果转换失败,idx
将被设置为 0。 - 使用
base
参数时,如果设置为0,函数会根据字符串的前缀自动确定数制。如果字符串以 “0x” 或 “0X” 开头,表示十六进制;如果以 “0” 开头,表示八进制;否则,表示十进制。