📘string类操作

2026-09-03
⭐⭐ GESP 3级

📖概念讲解

【考点 · 3级】string 是 C++ 标准库的字符串类,属于 字符串处理 考点,比 C 风格的 char 数组好用一万倍。

【说人话】string 能自动管理内存(不用你算长度、不用手动加 '\0'),还能直接用 + 拼接、用 == 比较、用 << 整体输入输出。易错点:cin >> s 遇到空格就停!要读一整行得用 getline(cin, s)。

💡 核心 API 速记:size()/length() 取长度 · substr(pos, len) 截取子串 · find(str) 查找位置 · push_back() 尾部加字符 · insert()/erase() 插入删除

💻代码示例

1#include<iostream>
2#include<string>
3using namespace std;
4
5int main() {
6 string s = "Hello"; // 初始化字符串
7 cout << "长度: " << s.size() << endl; // size()返回字符个数,结果为5
8
9 s.push_back('!'); // 尾部追加一个字符,s变成"Hello!"
10 s += " World"; // += 拼接字符串,s变成"Hello! World"
11
12 int pos = s.find("World"); // find返回子串首次出现的位置,找不到返回-1(实际是string::npos)
13 cout << "World位置: " << pos << endl; // 输出7
14
15 string sub = s.substr(7, 5); // 从位置7开始截取5个字符
16 cout << "子串: " << sub << endl; // 输出World
17
18 s.erase(5, 2); // 从位置5删除2个字符(!空格),去掉了"! "
19 cout << "删除后: " << s << endl; // 输出HelloWorld
20
21 // 逐字符访问
22 for (int i = 0; i < (int)s.size(); i++) { // 必须转int,否则无符号比较出bug
23 cout << s[i] << " "; // 用下标访问第i个字符
24 }
25 // 输出 H e l l o W o r l d
26 return 0;
27}

🧩互动小测

Q1:string s = "abc"; s += "de"; 执行后 s 的值是?

Q2:string s = "hello"; cout << s.find("xyz"); 输出什么?

Q3:s.substr(2, 3) 对于 s = "abcdef",结果是?

🏋️动手练一练

📝 编程练习

给定一个字符串 s(只含小写字母),统计其中每个字符出现的次数,并按字母顺序输出出现过至少一次的字符和次数。
输入:abracadabra
输出:a:5 b:2 c:1 d:1 r:2
提示:用一个 int 数组 cnt[26] 记录每个字母的出现次数,遍历字符串时用 s[i]-'a' 作为下标。
参考答案:
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;                // 读入字符串
    int cnt[26] = {0};        // 统计26个字母的次数,初始化为0
    for (int i = 0; i < (int)s.size(); i++) {
        cnt[s[i] - 'a']++;    // s[i]-'a'把字母映射到0-25的下标
    }
    for (int i = 0; i < 26; i++) {
        if (cnt[i] > 0) {
            cout << (char)('a' + i) << ":" << cnt[i] << " ";
        }
    }
    return 0;
}
// 输出: a:5 b:2 c:1 d:1 r:2

要点:字符减 'a' 得到 0-25 的下标是经典技巧;遍历完再按字母序输出即可。

📝易错点提醒

学完这个知识点后点一下