题解 | 进制转换
进制转换
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+D
或Ctrl+Z
)。
2. stoi
函数详解
函数原型
int stoi(const string& str, size_t* pos = 0, int base = 10);
- 功能:将字符串
str
转换为整数。 - 参数: str:要转换的字符串。pos(可选):一个指针,用于存储转换结束的位置(即第一个无法转换的字符的位置)。如果不需要该信息,可以传入 nullptr 或省略。base(可选):转换的进制基数,默认为 10(十进制)。可以是 2 到 36 之间的任意进制。
- 返回值:转换后的整数。
参数说明
- str:要转换的字符串。字符串可以包含正负号(+ 或 -)以及数字字符。如果字符串以 0x 或 0X 开头,stoi 会自动将其识别为十六进制数。
- pos:用于存储转换结束的位置。例如,如果字符串是 "123abc",pos 将指向字符 'a' 的位置。如果不需要该信息,可以传入 nullptr 或直接省略。
- base:指定字符串的进制基数。常用的值: 10:十进制。16:十六进制。8:八进制。2:二进制。如果 base 为 0,stoi 会根据字符串的前缀自动推断进制: 0x 或 0X:十六进制。0:八进制。其他:十进制。
3. 代码解析
代码逻辑
string str; while (cin >> str) { cout << stoi(str, 0, 16) << endl; }
- cin >> str:从标准输入读取一个字符串(以空格或换行符分隔)。如果输入结束(例如,用户按下 Ctrl+D 或 Ctrl+Z),cin >> str 会返回 false,循环结束。
- stoi(str, 0, 16):将字符串 str 解析为十六进制整数。第二个参数 0 表示忽略转换结束的位置。第三个参数 16 表示将字符串视为十六进制数。
- cout << ... << endl:输出转换后的十进制整数,并换行。
4. 示例运行
输入
1A FF 10
输出
26 255 16
解释
1A
(十六进制) =26
(十进制)FF
(十六进制) =255
(十进制)10
(十六进制) =16
(十进制)
5. 注意事项
- 异常处理:如果字符串无法转换为有效的整数,stoi 会抛出 invalid_argument 异常。如果转换结果超出 int 的范围,stoi 会抛出 out_of_range 异常。可以使用 try-catch 块捕获异常。
- 自动推断进制:如果 base 为 0,stoi 会根据字符串的前缀自动推断进制。例如: stoi("0x1A", nullptr, 0) 会自动识别为十六进制。stoi("077", nullptr, 0) 会自动识别为八进制。
- 其他类似函数: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
参数,可以支持多种进制(如十六进制、八进制、二进制等)。 - 需要注意异常处理,以避免程序崩溃。