在C++中,atoi
和 stoi
是用于将字符串转换为整数的函数,但它们来自不同的库,具有不同的行为和特性。
atoi (来自C库)
atoi
是C标准库 <cstdlib>
中的函数,用于将字符串转换为整数。它的原型是:
int atoi(const char *str);
- 参数:一个指向以空字符('\0')结尾的字符串的指针。该字符串应包含要转换的整数表示形式。
- 返回值:如果转换成功,函数返回转换后的整数;如果转换失败(例如,字符串不包含可识别的数字或超出了整数的表示范围),则行为是未定义的,但通常返回0。
stoi (来自C++标准库)
stoi
是C++标准库 <string>
中的函数,提供了更安全、更强大的整数转换功能。它的原型是:
int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
- 参数:
str
:要转换的字符串。pos
(可选):一个指向std::size_t
对象的指针,用于存储第一个非数字字符的位置。如果不需要此信息,可以省略此参数。base
(可选):用于解释数字的基数(例如,10表示十进制,16表示十六进制)。默认值为10。
- 返回值:如果转换成功,函数返回转换后的整数。
- 异常:如果转换失败(例如,字符串不包含可识别的数字,或者数字超出了整数的表示范围),则抛出
std::invalid_argument
或std::out_of_range
异常。
示例
atoi 示例
#include <cstdlib>
#include <iostream>
int main() {
const char* str = "12345";
int num = atoi(str);
std::cout << "Number: " << num << std::endl; // 输出: Number: 12345
const char* badStr = "abc";
int badNum = atoi(badStr); // 未定义行为,但通常返回0
std::cout << "Bad Number: " << badNum << std::endl; // 输出可能是: Bad Number: 0
return 0;
}
stoi 示例
#include <string>
#include <iostream>
int main() {
std::string str = "12345";
int num = std::stoi(str);
std::cout << "Number: " << num << std::endl; // 输出: Number: 12345
std::string badStr = "abc";
try {
int badNum = std::stoi(badStr); // 抛出 std::invalid_argument 异常
} catch (const std::invalid_argument& e) {
std::cerr << "Invalid argument: " << e.what() << std::endl; // 输出错误信息
}
std::string tooBigStr = "12345678901234567890"; // 假设int类型为32位,这将超出范围
try {
int tooBigNum = std::stoi(tooBigStr); // 抛出 std::out_of_range 异常
} catch (const std::out_of_range& e) {
std::cerr << "Out of range: " << e.what() << std::endl; // 输出错误信息
}
return 0;
}
总结
atoi
提供了简单的整数转换功能,但缺乏错误处理机制,并且在转换失败时行为是未定义的。stoi
提供了更强大、更安全的整数转换功能,包括错误处理和可选的基数参数。当处理用户输入或不确定的字符串时,使用stoi
通常更为安全。