文章目录
- 💯前言
- 💯1. 使用 stoi 和 stol 函数
- 1.1 stoi 和 stol 的基本概述
- 参数说明
- 进制支持
- 示例代码与解析
- 运行结果
- 解析
- 异常处理
- 💯2. 使用 stod 和 stof 函数
- 2.1 stod 和 stof 的基本概述
- 参数说明
- 示例代码与解析
- 运行结果
- 解析
- 异常处理
- 💯3. 使用 to_string 函数
- 3.1 to_string 的基本概述
- 特点
- 示例代码与解析
- 运行结果
- 解析
- 💯小结
💯前言
- C++ 提供了强大的文本处理和数值转换功能组件,为程序员高效开发提供了便利工具,例如 std::stoi、std::stol、std::stod,以及实现反向操作的 std::to_string。这些函数在处理字符串与数值之间的转换时,表现出高度的灵活性和高效性。
本文将全面解析 C++ 中这些 string 相关的工具函数,包括它们的原理、用法、应用场景,以及必要的拓展内容,以帮助读者更好地掌握这些函数的使用,并在实际开发中灵活运用。
C++ 参考手册
💯1. 使用 stoi 和 stol 函数
1.1 stoi 和 stol 的基本概述
在 C++ 中:
- std::stoi 用于将字符串类型转换为 int 类型。
- std::stol 用于将字符串类型转换为 long 类型。
它们的函数原型如下:
int stoi(const string& str, size_t* idx = 0, int base = 10);
long stol(const string& str, size_t* idx = 0, int base = 10);
参数说明
- str:待解析的字符串。
- idx:可选参数,用于返回解析结束的位置(字符串中第一个无法被转换的字符位置)。如果不需要返回位置,可传入
nullptr
或忽略。 - base:表示字符串中数值部分的进制,默认为 10(十进制),也可以是 2、8、16 等。
进制支持
- base = 2:字符串将按二进制解析。
- base = 8:字符串将按八进制解析。
- base = 16:字符串将按十六进制解析。
- base = 0:自动检测进制,例如:
- 以
0x
或0X
开头的字符串会被解析为十六进制。 - 以
0
开头但不含x
的字符串会被解析为八进制。 - 没有前缀的字符串默认为十进制。
- 以
示例代码与解析
以下是一个具体的代码示例,展示了 stoi
和 stol
的用法:
#include <iostream>
#include <string>
using namespace std;int main() {size_t pos = 0;string s1 = "11x34";int ret1 = stoi(s1, &pos, 16); // 按 16 进制解析cout << ret1 << endl; // 输出结果cout << "pos:" << pos << endl; // 输出解析位置string s2 = "11x34";int ret2 = stoi(s2, &pos, 2); // 按 2 进制解析cout << ret2 << endl; // 输出结果cout << "pos:" << pos << endl;string s3 = "0x11x34";int ret3 = stoi(s3, &pos, 0); // 自动检测进制cout << ret3 << endl;cout << "pos:" << pos << endl;return 0;
}
运行结果
17
pos:2
3
pos:2
17
pos:4
解析
- 第一部分:
- 输入字符串
"11x34"
,按 16 进制解析,11
表示十六进制中的17
。 - 返回值
ret1 = 17
,pos = 2
表示解析结束时的字符串位置。
- 输入字符串
- 第二部分:
- 按二进制解析,
11
表示二进制中的3
。 - 返回值
ret2 = 3
,pos = 2
。
- 按二进制解析,
- 第三部分:
- 自动检测进制,
0x11
被解析为十六进制的17
。 - 返回值
ret3 = 17
,pos = 4
。
- 自动检测进制,
异常处理
- 如果字符串中没有可以解析的数值,将抛出
std::invalid_argument
异常。 - 如果值超出目标类型的范围,将抛出
std::out_of_range
异常。
💯2. 使用 stod 和 stof 函数
2.1 stod 和 stof 的基本概述
- std::stod:将字符串类型转换为 double 类型。
- std::stof:将字符串类型转换为 float 类型。
它们的函数原型如下:
double stod(const string& str, size_t* idx = 0);
float stof(const string& str, size_t* idx = 0);
参数说明
- str:待解析的字符串。
- idx:与
stoi
和stol
类似,用于返回解析结束的位置。
示例代码与解析
#include <iostream>
#include <string>
using namespace std;int main() {string s = "3.14x456";double ret = stod(s, nullptr); // 转换为 double 类型cout << ret << endl; // 输出结果return 0;
}
运行结果
3.14
解析
stod
从字符串开头解析3.14
,转换为 double 类型。- 遇到非数字字符时(如
x456
),解析停止,但不会报错。
异常处理
- 如果字符串中没有可以解析的数值,将抛出
std::invalid_argument
异常。 - 如果值超出目标类型的范围,将抛出
std::out_of_range
异常。
💯3. 使用 to_string 函数
3.1 to_string 的基本概述
std::to_string
用于将数值类型转换为字符串。其函数原型如下:
string to_string(int val);
string to_string(long val);
string to_string(long long val);
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
特点
- 支持多种数值类型(整数、浮点数等)。
- 返回值为标准的
string
类型,便于字符串操作。
示例代码与解析
#include <iostream>
#include <string>
using namespace std;int main() {string pi = "pi is " + to_string(3.14159); // 将浮点数转换为字符串cout << pi << endl; // 输出结果return 0;
}
运行结果
pi is 3.141590
解析
- 浮点数
3.14159
被转换为字符串并拼接到"pi is "
后。 - 注意,输出的浮点数可能包含更多的有效数字,因为它保留了内部存储的精度。
💯小结
通过本次学习,我们全面解析了 C++ 中与字符串相关的数值转换函数,包括 stoi
、stol
、stod
、stof
和 to_string
的基本用法、特性以及实际代码示例。这些函数在实际开发中用途广泛,尤其在处理用户输入、文件解析和格式化输出时极为有用。
建议读者在实践中多尝试不同参数的组合,以及结合异常处理机制,确保程序的健壮性。如果对本文内容还有疑问或希望更深入了解某些特定函数,欢迎继续交流探讨!