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/
作者
Leec
发布于
2024年3月25日
许可协议