问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++中stoi函数的使用详解

创作时间:
作者:
@小白创作中心

C++中stoi函数的使用详解

引用
1
来源
1.
https://www.cnblogs.com/hisun9/p/18549333

stoi函数是C++标准库中用于将字符串转换为整数的重要工具。本文将详细介绍stoi函数的原型、参数、功能、常见用法以及异常处理,并通过多个代码示例展示其具体应用。

函数原型

int stoi(const std::string& str, size_t* idx = 0, int base = 10);

  • idx(可选):用来存储解析结束的位置(字符串中第一个非数字字符的索引)。如果不需要这个信息,可以传入 nullptr 或省略。
  • base(可选):数字的进制,默认值为 10(十进制)。支持 2-36 的进制转换(注意是将base指定的进制转换为十进制,后面的常见用法里面会举一个相关的例子)。

功能描述

  • 将字符串转换为整数。如果字符串中有非法字符,stoi 会抛出异常。
  • 字符串可以包含前导空格和符号(+ 或 -)。
  • 转换以第一个非数字字符或字符串末尾结束。

常见用法

1. 基本转换

将字符串转换为整数:

int main() {
    std::string s = "123";
    int num = std::stoi(s);
    std::cout << "整数值: " << num << std::endl; // 输出: 123
    return 0;
}

2. 转换含符号的数字

可以处理正负号:

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 提取未转换的部分:

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. 转换不同进制的数字

支持其他进制(例如二进制、十六进制等):

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 类型的范围。

举个例子:

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::stofstd::stod
  • stoi 是基于 std::strtol 实现的,但比 std::strtol 更易用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号