Skip to content

16. 字符串基础:文字处理大师

前置学习:一维数组

以前我们处理文本,用的是 char(单个字符)。如果要存一句完整的话,在古老的 C 语言中,必须用“字符数组” char s[100]。但这玩意儿极难使用,稍有不慎就会越界乱码。

好在现代 C++ 为我们提供了一个极其强大的数据类型:string(字符串)

1. string 的基础操作

你可以把 string 想象成一列火车,每一节车厢里都装着一个字符(字母、数字或符号)。

cpp
#include <bits/stdc++.h> // 万能头文件已经包含了 <string>
using namespace std;

int main() {
    // 1. 声明与赋值(必须用双引号!)
    string s1 = "Hello";
    string s2 = "OIer";
    
    // 2. 字符串拼接(直接用加号,神仙操作!)
    string s3 = s1 + ", " + s2 + "!"; 
    cout << s3 << endl;  // 输出:Hello, OIer!
    
    // 3. 获取长度(这列火车有几节车厢?)
    int len = s3.size(); // 或者写 s3.length()
    cout << "长度是:" << len << endl;
    
    return 0;
}

2. 把 string 当成数组来玩

string 的底层其实就是一个数组,所以我们可以用中括号 [] 来访问它的每一个字母。并且,它的下标也是从 0 开始的!

cpp
string name = "Apple";
cout << name[0]; // 输出 A
cout << name[4]; // 输出 e

// 配合 for 循环,把字符串的每个字母拆开处理:
for (int i = 0; i < name.size(); i++) {
    cout << name[i] << " ";
}
// 输出:A p p l e

3. 💀 竞赛巨坑:会隐身的空格

在做字符串题目时,输入数据的接收是最容易翻车的环节。

陷阱:cin 遇到空格就罢工

cpp
string s;
cin >> s; 
// 假设你在键盘输入了:Hello World
// 此时 s 里面只有 "Hello"!后面的 " World" 被无情地丢在了外面。

原因cin 默认以空格、制表符、回车作为数据的分隔符。它读到 Hello 后面的空格时,以为数据结束了,就立刻停了下来。

破解之法:连着空格一起读 (getline) 如果题目要求读入一整行句子(包含空格),必须用 getline 函数:

cpp
string s;
// 意思是:从 cin 通道里,读取一整行数据,存进 s 中(遇到回车才停止)
getline(cin, s);

4. 动手实践

md
1. 打开左下角的代码沙盒。
2. 编写一个程序:用 `cin >> s` 读取一个单词。
3. 利用 `for` 循环,**倒序**打印出这个单词。
   *(提示:字符串的最后一个字母的下标是多少?应该是 `s.size() - 1`。所以 for 循环的初始状态应该是 `int i = s.size() - 1`,并且条件是 `i >= 0`,每次执行 `i--`。)*
💻 运行代码

C++ 在线评测沙盒

📥 标准输入 (cin):
📤 终端输出 (cout):