1. C++字符串 string
string
是C++内置库中的字符串类型,表示一个可变长度的字符序列。其位于std
命名空间中,使用时需要包含<string>
头文件。
#include <string>
using std::string;
string s = "abc";
- 初始化
string s1; // 默认初始化为空串"" string s2 = "abc"; // 拷贝初始化 string s3("abc"); // 直接初始化 string s4(s3, 2); // 直接初始化(重复),值为"abcabc"
- 获取大小
size_t a = s3.size() // a = 6
- 比较
可以直接使用比较运算符进行比较,返回两个字符串自前向后依次将字符按字典序进行比较的结果。 - 拼接
可以直接使用 算术运算符+
进行拼接。string s5 = s3 + s4; // "abcabcabc"
- 删除
使用erase
方法可以删除字符串中的指定字符或子串,该函数所包含的三种重载形式如下所示:string& erase (size_t pos = 0, size_t len = npos); // 给定起始位置和删除字符数量 iterator erase (const_iterator p); // 根据迭代器进行字符删除 iterator erase (const_iterator first, const_iterator last); // 根据迭代器给定的范围进行删除
更多操作可以参考https://cplusplus.com/reference/string/string/
2. C风格字符串
本质上是一个尾部以\0
空字符作为终止符的字符数组。
char a[] = "abc"; // a的长度为4, "abc\0"
char b[] = {'a', 'b', 'c'}; // b不是一个字符串,因为尾部没有终止符
char c[4] = {'a', 'b', 'c'}; // c是一个字符串,因为c指定了大小为4,
在上面的例子中,前者使用字符串字面量对字符串a
进行初始化,字符串字面量其类型为const char[4]
,即该字面量中已经包含了尾部空字符\0
;对b
采用列表初始化,列表中没有在尾部添加终止符,因此b
不是一个合法的字符串;而对于c
而言,在声明符中明确指定数组长度为4,不以列表大小决定字符数组长度,此时没有给出的元素将初始化为0值,那么尾部的终止符相当于被自动加上。
- 比较
C风格字符串本质上为字符数组,若向string对象一样使用>
、==
、<
等运算符进行比较的话,则数组名会被视作指针,也就是说比较的是二者地址值的大小,与初衷相悖。要想比较C风格字符串,需使用strcmp
函数。当返回值为0时二者相等,当>0时则前者大,反之则后者大。char a[] = "abcdef"; char b[] = "ad"; int cmpResult = strcmp(a, b); if(cmpResult == 0){ printf("a = b"); }else if(cmpResult > 0){ printf("a > b"); }else{ printf("a < b"); }
- 拼接
拼接C风格字符串,需要预先估算结果大小,并根据该大小分配一块新的字符数组空间。然后依次调用strcpy
和strcat
将要拼接的字符串转移到结果空间中去。
同时,C风格字符串支持与char a[] = "hello"; char b[] = "world"; char c[12] = {0}; strcpy(c, a); strcat(c, ","); strcat(c, b); printf(c); // "hello,world"
string
混合拼接,但这是由string
类型的operator+
操作符重载提供的能力,因此在表达式中不能出现两个C风格符串相加的中间计算。string d = "hello"; d = d + "," + b; // d "hello,world" d = "hello" + "," + d; // error