C++ string操作指南:从入门到精通
一、为什么要用 string?
之前学的char[]缺点:
- 必须手动处理
\0,容易乱码 - 不能直接用
=赋值、+拼接 - 长度受限,容易越界
- 函数少,操作麻烦
string 优点:
- 是 C++ 标准类,安全方便
- 可以直接
=、+、==比较 - 自动管理内存,不用管
\0 - 内置大量常用函数
头文件:
#include <string> using namespace std;二、string 定义与初始化
// 1. 空字符串 string s1; // 2. 直接初始化 string s2 = "hello world"; // 3. 构造方式 string s3("C++ string"); // 4. 重复 n 个字符 string s4(5, 'a'); // "aaaaa"三、最常用操作(必背)
1. 赋值 =
string s; s = "hello";2. 拼接 +
string s1 = "hello"; string s2 = " world"; string s3 = s1 + s2; // "hello world"3. 访问单个字符(像数组一样)
string s = "hello"; cout << s[0]; // 'h' cout << s[1]; // 'e'4. 比较 > < == !=
直接按字典序比较,非常方便:
string s1 = "apple"; string s2 = "banana"; if (s1 < s2) { … } // 成立 if (s1 == "apple") { … }四、string 常用成员函数
1. 获取长度
int len = s.size(); // 常用 int len = s.length(); // 一样2. 判断是否为空
if (s.empty()) { … }3. 截取子串 substr
// 从下标 0 开始,取 3 个字符 string sub = s.substr(0, 3);4. 查找 find(查找失败返回 string::npos)
int pos = s.find("llo"); if (pos != string::npos) { cout << "找到了,下标:" << pos; }5. 替换 replace
// 从下标 2 开始,删除 2 个字符,替换成 "xx" s.replace(2, 2, "xx");6. 插入 insert
s.insert(1, "++"); // 下标 1 处插入7. 删除 erase
s.erase(2, 3); // 从下标 2 删 3 个字符五、输入与输出
string s; cin >> s; // 遇到空格/回车停止 getline(cin, s); // 读取一整行(包括空格) cout << s << endl;注意:cin >> s后如果要用getline,需要吸收换行符。
六、完整综合示例
#include <iostream> #include <string> using namespace std; int main() { string s = "hello c++"; cout << "长度:" << s.size() << endl; cout << "子串:" << s.substr(0, 5) << endl; int pos = s.find("c++"); if (pos != string::npos) { cout << "c++ 在下标:" << pos << endl; } s.replace(6, 3, "Python"); cout << "替换后:" << s << endl; system("pause"); return 0; }七、string vs char [] 对比(面试常问)
表格
| 特性 | char[] | string |
|---|---|---|
| 内存 | 固定大小,手动管理 | 自动扩容 |
| 赋值 / 拼接 | 不能直接=+ | 可以直接用 |
| 结束符 | 必须\0 | 自动处理 |
| 安全性 | 易越界、乱码 | 更安全 |
| 功能 | 极少 | 非常丰富 |
一句话:C++ 写字符串优先用 string!
八、新手易错点
- 忘记
#include <string> - 用
scanf/printf直接读写 string(会错) find没找到不判断,直接用下标- 下标越界访问
- 混用
cin >>和getline导致读空行
九、今日重点总结
string是 C++ 标准字符串,头文件<string>- 支持直接
=赋值、+拼接、==比较 - 常用函数:
size() / empty() / substr() / find() / replace() / insert() / erase() - 读整行用
getline(cin, s) - 比 char 数组更安全、更强大,优先使用
