一维¶
字符串可以用 string 表示,也可以用一维字符数组表示。
前者是 C++ 风格的字符串,后者是 C 风格的字符串。
用 string 表示字符串¶
在标准模板库 STL 中,建立了有关字符串操作的 string 类。
定义
初始化
输入输出
访问
遍历
// s.size() 在标准 string 中是 O(1),直接写 i < s.size() 也不会因此超时。
// 注意 s.size() 返回无符号类型;这里保存长度是为了让循环写法更直观。
for (int i = 0, len = s.size(); i < len; i++)
cout << s[i];
用 string 的基础操作¶
赋值
拼接
判断相等
截取子串
插入子串
替换子串
删除子串
翻转字符串
.find() 查找函数
// 查找子串、查找字符,返回第一次出现的位置,不存在返回 string::npos
// 常用于判断一个字符串是否为另一个字符串的子串
// 查找子串zq第一次出现的位置
s.find("zq");
// 查找字符q第一次出现的位置
s.find('q');
// 如果没找到
if (s.find("zq") == string::npos) cout << "Not find";
// 从下标p那个位置往后找"zq"第一次出现的位置
s.find("zq", p);
.find() 函数,向后找一个,替换一个
// 这个操作通常用来向右,找到一个替换一个,循环迭代向右替换
// 直到都替换完了,结束
string s = "zqoizqoizqoizqoizqoizqoizqoi";
int p = 0;
while (s.find("zq", p) != string::npos) {
p = s.find("zq", p);
s.replace(p, 2, "NB");
}
cout << s;
??? string的长度和占用存储空间的问题(先不看)
从下面三个实例中,我们可以得到这样的结论:
`.size()` 表示字符串当前包含的字符数。`sizeof(s)` 是 `string` 对象本身的大小,由标准库实现决定,不保证是 32 字节,也不包括可能动态分配的字符缓冲区。
<img src="https://zqiceberg-picgo.oss-cn-beijing.aliyuncs.com/img/202509121606149.png" alt="image-202509121606161 23" style="zoom:70%;" />
<img src="https://zqiceberg-picgo.oss-cn-beijing.aliyuncs.com/img/202509121606200.png" alt="image-20250912160637175" style="zoom:60%;" />
<img src="https://zqiceberg-picgo.oss-cn-beijing.aliyuncs.com/img/202509121607919.png" alt="image-20250912160755894" style="zoom:63%;" />
用一维字符数组表示字符串¶
定义
初始化
对于这里长度为 110 的数组,两种初始化都会得到 'z'、'q'、'\0' 以及后续的 0。
下面是数组中的存储内容
C 风格字符串必须以 '\0' 作为结束标记。字符串字面量初始化和成功的 cin >> s、scanf("%s", s) 会写入这个结束符;逐个手动赋值时则需要自己保证末尾有 '\0'。
'\0' 对应的 ASCII 码为 0。
输入输出
使用 cin, cout
使用 scanf(), printf()
访问
遍历
用一维字符数组的基本操作(先不看)¶
长度
判断相等
拼接
复制
??? strcpy与memcpy的区别(先不看)
`strcpy` 是“拷贝字符串”用的,`memcpy` 是“拷贝内存块”用的。
`strcpy`:
- 必须依赖 `'\0'`
- 遇到 `'\0'` 才停止
`memcpy`:
- 完全不依赖 `'\0'`
- 你让它拷多少字节,它就拷多少字节
关于以 '\0' 结尾的讨论¶
从下面两个计算机实验中,我们可以得到这样的结论:
\0 不占字符串的长度,但占用字符串的存储空间。

