一维¶
字符串可以用 string 表示,也可以用一维字符数组表示。
前者是 C++ 风格的字符串,后者是 C 风格的字符串。
用 string 表示字符串¶
在标准模板库 STL 中,建立了有关字符串操作的 string 类。
定义
初始化
输入输出
访问
遍历
for (int i = 0, len = s.size(); i < len; i++)
cout << s[i];
// 这个地方,要把s.size()提到len中使用,
// 而不是放在 i < s.size()
// 因为.size()函数是有执行时间的,多次调用,会因此超时
用 string 的基础操作¶
赋值
拼接
判断相等
截取子串
插入子串
替换子串
翻转字符串
.find() 查找函数
// 查找子串、查找字符,返回第一次出现的位置,不存在返回 string::npos(一般理解为-1)
// 常用于判断一个字符串是否为另一个字符串的子串
s.find("zq"); // 查找子串zq第一次出现的位置
s.find('q'); // 查找字符q第一次出现的位置
if (s.find("zq") == string::npos) cout << "Not find"; // 如果没找到
s.find("zq", p); // 从下标p那个位置往后找"zq"第一次出现的位置
.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 表示占用存储空间都是 32 字节。



用一维字符数组表示字符串¶
定义
初始化
这两种初始化的方法,存储到字符数组中的格式是完全一致的。
下面是数组中的存储内容
字符数组存入相应的字符后,自动在末尾添加一个特殊字符 '\0',作为字符串的结束标记。
'\0' 对应的 ASCII 码为 0。
输入输出
使用 cin, cout
使用 scanf(), printf()
访问
遍历
用一维字符数组的基本操作¶
长度
判断相等
拼接
复制
Strcpy与memcpy的区别
strcpy 是“拷贝字符串”用的,memcpy 是“拷贝内存块”用的。
strcpy:
- 必须依赖
'\0' - 遇到
'\0'才停止
memcpy:
- 完全不依赖
'\0' - 你让它拷多少字节,它就拷多少字节
关于以 '\0' 结尾的讨论¶
从下面两个计算机实验中,我们可以得到这样的结论:
\0 不占字符串的长度,但占用字符串的存储空间。

