题解 | 进制转换

进制转换

https://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    while (cin >> str) {
        try {
            // 尝试将字符串转换为十六进制整数
            cout << stoi(str, nullptr, 16) << endl;
        } catch (invalid_argument& e) {
            // 捕获无效输入异常
            cout << "无效输入: " << str << endl;
        } catch (out_of_range& e) {
            // 捕获超出范围异常
            cout << "输入超出范围: " << str << endl;
        }
    }
    return 0;
}

这段代码展示了如何使用 C++ 标准库中的 stoi 函数将字符串转换为整数。下面我们详细讲解 stoi 函数的功能、参数以及代码的运行逻辑。

1. 代码功能

  • 从标准输入(通常是键盘输入)读取字符串。
  • 将字符串解析为十六进制整数,并输出其十进制值。
  • 循环读取输入,直到输入结束(例如,用户按下 Ctrl+DCtrl+Z)。

2. stoi 函数详解

函数原型

int stoi(const string& str, size_t* pos = 0, int base = 10);
  • 功能:将字符串 str 转换为整数。
  • 参数: str:要转换的字符串。pos(可选):一个指针,用于存储转换结束的位置(即第一个无法转换的字符的位置)。如果不需要该信息,可以传入 nullptr 或省略。base(可选):转换的进制基数,默认为 10(十进制)。可以是 2 到 36 之间的任意进制。
  • 返回值:转换后的整数。

参数说明

  1. str:要转换的字符串。字符串可以包含正负号(+ 或 -)以及数字字符。如果字符串以 0x 或 0X 开头,stoi 会自动将其识别为十六进制数。
  2. pos:用于存储转换结束的位置。例如,如果字符串是 "123abc",pos 将指向字符 'a' 的位置。如果不需要该信息,可以传入 nullptr 或直接省略。
  3. base:指定字符串的进制基数。常用的值: 10:十进制。16:十六进制。8:八进制。2:二进制。如果 base 为 0,stoi 会根据字符串的前缀自动推断进制: 0x 或 0X:十六进制。0:八进制。其他:十进制。

3. 代码解析

代码逻辑

string str;
while (cin >> str) {
    cout << stoi(str, 0, 16) << endl;
}

  1. cin >> str:从标准输入读取一个字符串(以空格或换行符分隔)。如果输入结束(例如,用户按下 Ctrl+D 或 Ctrl+Z),cin >> str 会返回 false,循环结束。
  2. stoi(str, 0, 16):将字符串 str 解析为十六进制整数。第二个参数 0 表示忽略转换结束的位置。第三个参数 16 表示将字符串视为十六进制数。
  3. cout << ... << endl:输出转换后的十进制整数,并换行。

4. 示例运行

输入

1A
FF
10

输出

26
255
16

解释

  • 1A(十六进制) = 26(十进制)
  • FF(十六进制) = 255(十进制)
  • 10(十六进制) = 16(十进制)

5. 注意事项

  1. 异常处理:如果字符串无法转换为有效的整数,stoi 会抛出 invalid_argument 异常。如果转换结果超出 int 的范围,stoi 会抛出 out_of_range 异常。可以使用 try-catch 块捕获异常。
  2. 自动推断进制:如果 base 为 0,stoi 会根据字符串的前缀自动推断进制。例如: stoi("0x1A", nullptr, 0) 会自动识别为十六进制。stoi("077", nullptr, 0) 会自动识别为八进制。
  3. 其他类似函数:stol:将字符串转换为 long。stoll:将字符串转换为 long long。stoul:将字符串转换为 unsigned long。

6. 改进代码(添加异常处理)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    while (cin >> str) {
        try {
            cout << stoi(str, nullptr, 16) << endl;
        } catch (invalid_argument& e) {
            cout << "无效输入: " << str << endl;
        } catch (out_of_range& e) {
            cout << "输入超出范围: " << str << endl;
        }
    }
    return 0;
}

7. 总结

  • stoi 是一个强大的函数,用于将字符串转换为整数。
  • 通过指定 base 参数,可以支持多种进制(如十六进制、八进制、二进制等)。
  • 需要注意异常处理,以避免程序崩溃。
全部评论

相关推荐

认真搞学习:这么良心的老板真少见
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 11:47
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务