string 转 int 的推荐做法
std::atoi
#include <iostream>
int main()
{
int num = std::atoi("123456789212");
std::cout << num << std::endl;
return 0;
}
缺点:无法判断是否转换成功。
std::stoi
#include <iostream>
int main()
{
try {
int num = std::stoi("12345678901111");
std::cout << num << std::endl;
} catch (std::invalid_argument &e) {
std::cout << "Invalid argument: " << e.what() << std::endl;
} catch (std::out_of_range &e) {
std::cout << "Out of range: " << e.what() << std::endl;
} catch (...) {
std::cout << "Unknown exception" << std::endl;
}
return 0;
}
优点:可以判断是否转换成功。
缺点:会抛异常。
std::strtol
#include <iostream>
#include <cstdlib>
int main()
{
const char *str = "123456789123123";
char *endPtr = nullptr;
long num = std::strtol(str, &endPtr, 10);
if (*endPtr != '\0') {
std::cout << "transform failed, pos=" << endPtr << std::endl;
} else {
std::cout << "transform ok, num=" << num << std::endl;
}
return 0;
}
优点:可以判断是否转换成功。
缺点:处理溢出问题很麻烦,编译器不同,返回值也不同,返回长整型数的最大值(LONG_MAX)或最小值(LONG_MIN),并将 errno 设置为 ERANGE 来指示溢出错误。
推荐方法
#include <iostream>
#include <sstream>
int main()
{
int num = 0;
std::string str = "123239847598237458329";
std::istringstream iss(str);
iss >> num;
if (iss.fail() || iss.rdbuf()->in_avail() != 0) {
std::cout << "Error: Invalid input" << std::endl;
return -1;
}
std::cout << "Number: " << num << std::endl;
return 0;
}
优点:不抛异常,可以判断是否转换成功,可以处理溢出问题。
string 转 int 的推荐做法
https://leec.me/f219ebf6dbae/