文章目录
- String
- 1. 字符串定义和初始化
- 2. 字符串基本操作
- 2.1 访问单个字符
- 2.2 修改字符串内容
- 2.3 字符串查找和比较
- 3. 常用字符串函数
- 3.1 length() 和 size()
- 3.2 empty()
- 3.3 substr()
- 3.4 c_str()
- 4.字符与整形之间相互转换
- 4.1 char 类型转 int 类型
- 4.2 int 类型转 char 类型
- 4.3 stringstream 类型转换
String
string 是 C++ STL 中字符串操作的重要类,它封装了许多字符串操作函数,方便对字符串进行处理。下面介绍一下 string 相关的知识点和函数。
1. 字符串定义和初始化
C++ 中可以使用 char 数组或 string 来表示字符串。char 数组是一种静态数组,需要指定长度,而 string 可以自动调整大小。string 类型需要包含头文件 #include 。
string 类型的变量可以通过以下方式进行初始化:
string s1; // 空字符串
string s2 = "hello"; // 由字符串字面值初始化
string s3 = s2; // 由另一个字符串 s2 初始化
string s4(10, 'c'); // 由 n 个字符 c 构成的字符串
string s5{"hello"}; // C++11 标准引入的新语法
string s6 = {'h', 'e', 'l', 'l', 'o'}; // 由字符列表初始化,C++11 标准引入的新语法
2. 字符串基本操作
2.1 访问单个字符
可以使用数组下标或 at() 函数访问字符串中的单个字符。at() 函数会检查索引是否越界,如果越界则抛出异常。
string s = "hello";
char ch = s[1]; // 访问第二个字符
ch = s.at(3); // 访问第四个字符
2.2 修改字符串内容
可以使用数组下标或 at() 函数修改字符串中的单个字符,也可以使用赋值运算符和 assign() 函数修改整个字符串。另外,还可以使用 insert()、erase() 和 replace() 函数对字符串进行插入、删除和替换操作。
string s = "hello";
s[1] = 'a'; // 将第二个字符改为 a
s.at(3) = 'o'; // 将第四个字符改为 o
s = "world"; // 用字符串 "world" 重载 s
s.assign(10, 'c'); // 将 s 中的所有字符改为 c,总共有 10 个
s.insert(2, "123"); // 在 s 的第三个位置插入字符串 "123"
s.erase(1, 2); // 删除 s 的第二三个字符
s.replace(4, 2, "123"); // 将 s 中从第五个位置开始的两个字符替换成字符串 "123"
2.3 字符串查找和比较
可以使用 find()、rfind()、find_first_of()、find_last_of()、find_first_not_of() 和 find_last_not_of() 等函数在字符串中查找子串或字符,并返回其位置。另外,还可以使用 compare() 函数比较两个字符串的大小关系。
string s = "hello world";
size_t pos = s.find("world"); // 查找字符串 "world",返回其起始位置
pos = s.rfind("l"); // 从后往前查找字符 'l',返回其起始位置
pos = s.find_first_of("aeiou"); // 查找第一个元音字母,返回其起始位置
pos = s.find_last_of("0123456789"); // 从后往前查找数字,返回其位置
pos = s.find_first_not_of("helo wrd"); // 查找第一个不在指定集合中的字符,返回其位置
pos = s.find_last_not_of("dlrow olleh");// 从后往前查找第一个不在指定集合中的字符,返回其位置
int cmp = s.compare("hello world"); // 比较字符串是否相等,相等返回 0,小于则返回负数,大于则返回正数
3. 常用字符串函数
除了上面介绍的基本操作之外,string 类中还提供了许多其他的常用函数,比如 length()、size()、empty()、substr()、c_str() 等等。下面简单介绍一下这些函数。
3.1 length() 和 size()
length() 函数和 size() 函数都可以返回字符串的长度(即字符个数)。
string s = "hello";
int len = s.length(); // 获取字符串长度
len = s.size(); // 同上,两者等价
3.2 empty()
empty() 函数判断字符串是否为空。
string s = "hello";
bool flag = s.empty(); // 判断字符串是否为空,返回 false
s = "";
flag = s.empty(); // 判断字符串是否为空,返回 true
3.3 substr()
substr() 函数可以截取字符串的一部分并返回。
string s = "hello world";
string sub = s.substr(6, 5); // 截取从第七个字符开始的长度为 5 的子串,即 "world"
3.4 c_str()
c_str() 函数返回一个指向以空字符结束的字符数组的指针,它用于将 string 类型转换为 char* 类型的字符串。
string s = "hello";
const char* str = s.c_str(); // 获取 char* 类型的字符串,即 "hello"
4.字符与整形之间相互转换
4.1 char 类型转 int 类型
char 类型的变量本质上就是一个 ASCII 码值,因此可以通过将其强制类型转换为 int 类型来转换成整数。
char ch = '5';
int num = ch - '0'; // 将字符 '5' 转换成整数 5
上面的代码中,将字符 ‘5’ 减去字符 ‘0’ 的 ASCII 码值,得到的就是整数 5。
4.2 int 类型转 char 类型
将一个整数转换为对应的字符,可以使用强制类型转换或者字符字面值的形式。
int num = 5;
char ch = static_cast<char>(num + '0'); // 将数字 5 转换成字符 '5'
ch = num + '0'; // 同上,使用字符字面值的形式
注意,在将数字转换为字符时,需要加上字符 ‘0’ 的 ASCII 码值。因为在 ASCII 码表中,数字字符 ‘0’ 的编码为 48,而数字字符 ‘1’、‘2’、‘3’、…、‘9’ 的编码分别为 49、50、51、…、57。
另外,如果要将一个超过了可表示范围的整数转换为字符,结果是未定义的,可能会出现不可预测的错误。
4.3 stringstream 类型转换
除了上面介绍的方法之外,还可以使用 C++ STL 中的 stringstream 类型来进行字符和整型之间的转换。stringstream 类型用于在字符串流中读取、写入数据,它可以自动转换各种基本类型的数据。
#include <sstream>
using namespace std;int num = 123;
stringstream ss;
ss << num; // 将整数 num 写入 stringstream 对象 ss 中
string str;
ss >> str; // 从 ss 中读取字符串,并将其存储到变量 str 中
在代码执行完第 3 行后,ss 中就包含了整数 123 对应的字符串 “123”。第 5 行中,通过输入运算符 >> 把这个字符串读取到了变量 str 中。
类似地,还可以使用 stringstream 对象从字符串中读取整数,具体示例如下:
#include <sstream>
using namespace std;string str = "456";
stringstream ss(str);
int num;
ss >> num; // 从 ss 中读取字符串 "456",并将其解析成整数,存储到变量 num 中
这样,num 就等于整数 456 了。
以上是 char 和 int 类型相互转换的一些方法,掌握了这些方法,可以更加灵活地处理字符和整数之间的关系。