145 lines
4.4 KiB
Markdown
145 lines
4.4 KiB
Markdown
# 第8课:字符数组与string
|
||
|
||
## 教学目标
|
||
- 掌握 string 类的基本操作(长度、访问、截取、查找)
|
||
- 理解字符数组与 string 的区别
|
||
- 能处理字符串遍历、逆序、回文判断等常见问题
|
||
- 会用 `getline` 读取含空格的字符串
|
||
|
||
## 核心考点:字符串输入和逐字符处理
|
||
|
||
### 考什么
|
||
正确读取单词或整行文字,再逐个访问________,完成统计、查找、替换或回文判断。
|
||
|
||
### 必须理解
|
||
`cin >> s` 遇到________就停止;`getline(cin, s)` 会读取________。前面使用 `cin >>` 后,通常先执行________清理残留换行。字符串合法下标是________。
|
||
|
||
### 核心写法
|
||
```cpp
|
||
cin >> n;
|
||
____________________;
|
||
string s;
|
||
____________________;
|
||
|
||
for (int i = 0; i < ____________________; i++) {
|
||
char c = ________;
|
||
}
|
||
```
|
||
|
||
### 常见错误
|
||
- 为什么 `cin >> s` 不能读完整句子?________________
|
||
- `getline` 为什么有时会直接读到空行?________________
|
||
- `i <= s.length()` 错在哪里?________________
|
||
|
||
### 判断是否掌握
|
||
- [ ] 我能按输入格式选择读取方式。
|
||
- [ ] 我能处理 `cin` 后的残留换行。
|
||
- [ ] 我能无越界地逐字符处理字符串。
|
||
|
||
---
|
||
|
||
## 课堂编程题
|
||
|
||
### 课堂1:两种字符串输入【适中】
|
||
|
||
**题目描述:** 第一行输入一个不含空格的单词,使用字符数组保存;第二行输入一个可能含空格的句子,使用字符串保存。依次输出单词长度、句子长度以及句子中的空格数量。
|
||
|
||
**输入格式:** 第一行输入一个不含空格的单词;第二行输入一整句话。
|
||
|
||
**输出格式:** 依次输出单词长度、句子长度和空格数量。
|
||
|
||
**数据范围:** 单词和句子长度均不超过 200。
|
||
|
||
**输入样例:**
|
||
```text
|
||
GESP
|
||
I love C++
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
4 10 2
|
||
```
|
||
|
||
**解题思路:** 字符数组以 `'\0'` 作为结束标志;读完单词后先忽略换行,再用 `getline` 读取整行字符串。
|
||
|
||
**易错提醒:** `cin` 不会读入空格;`getline` 前要处理输入缓冲区中的换行符。
|
||
|
||
### 课堂2:字符串分类统计【适中】
|
||
|
||
**题目描述:** 输入一整行字符串,统计大写字母、小写字母、数字、空格和其他字符的数量。
|
||
|
||
**输入格式:** 输入一整行字符串。
|
||
|
||
**输出格式:** 依次输出五类字符的数量。
|
||
|
||
**数据范围:** 字符串长度不超过 500。
|
||
|
||
**输入样例:**
|
||
```text
|
||
Hi 2026!
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
1 1 4 1 1
|
||
```
|
||
|
||
**解题思路:** 使用下标遍历字符串,通过互斥分支判断字符所属类别。
|
||
|
||
**易错提醒:** 字符串的合法下标为 0 到长度减 1;分类时只能让一个字符进入一个计数器。
|
||
|
||
### 课堂3:敏感词替换与截取【适中】
|
||
|
||
**题目描述:** 输入一个不含空格的原字符串、待查找字符串和替换字符串。将原字符串中第一次出现的待查找内容替换掉,并输出替换结果;若未找到,输出 `NOT FOUND`。找到时还要输出替换位置之前的前缀。
|
||
|
||
**输入格式:** 依次输入原字符串、待查找字符串和替换字符串,三者均不含空格。
|
||
|
||
**输出格式:** 找到时第一行输出替换后的字符串,第二行输出原字符串中匹配位置之前的部分;未找到时输出 `NOT FOUND`。
|
||
|
||
**数据范围:** 每个字符串长度不超过 200。
|
||
|
||
**输入样例:**
|
||
```text
|
||
abc123abc 123 XYZ
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
abcXYZabc
|
||
abc
|
||
```
|
||
|
||
**解题思路:** 用 `find` 获得首次位置;用 `replace` 替换,用 `substr` 截取前缀。
|
||
|
||
**易错提醒:** 未找到时 `find` 返回 `string::npos`,不能直接拿这个位置去替换或截取。
|
||
|
||
### 课堂4:忽略格式的回文句【适中】
|
||
|
||
**题目描述:** 输入一整行字符串,忽略空格和英文字母大小写后,判断它是否为回文串。
|
||
|
||
**输入格式:** 输入一整行字符串。
|
||
|
||
**输出格式:** 是回文串输出 `YES`,否则输出 `NO`。
|
||
|
||
**数据范围:** 字符串长度不超过 500,只含英文字母和空格。
|
||
|
||
**输入样例:**
|
||
```text
|
||
Never odd or even
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
YES
|
||
```
|
||
|
||
**解题思路:** 先构造一个无空格、全小写的新字符串,再用左右下标向中间比较。
|
||
|
||
**易错提醒:** 比较前必须统一大小写;空字符串和单字符都属于回文串。
|
||
|
||
---
|
||
|
||
## 课后作业
|
||
> 请完成本课对应的课后作业,见编程题文件。
|