第11天:字符串 — 操作指南

📅 2026/8/3 7:33:01 👁️ 阅读次数 📝 编程学习
第11天:字符串 — 操作指南

小白记录日常学习

一、今日任务总览

| 步骤 | 内容 | 时间 |
|------|------|------|
| ① | 阅读教材:第4章 §4.1-4.3 + 第11章 §11.1-11.3 | 60分钟 |
| ② | 理解字符串在内存中的样子 | 20分钟 |
| ③ | 手打并运行3个练习 | 50分钟 |
| ④ | 自由实验 | 30分钟 |

二、今日核心知识点

2.1 字符串的本质

C 语言没有专门的"字符串类型"。字符串就是一个以 `'\0'` 结尾的 `char` 数组。

```
char name[] = "AB";

内存:
name[0] = 'A'
name[1] = 'B'
name[2] = '\0' ← C 自动加上的,标志"字符串在这里结束"
```

```
strlen("AB") = 2 ← 数到 '\0' 之前有几个字符
sizeof("AB") = 3 ← 包括隐式的 '\0'
```

2.2 字符串与指针

学完指针(第10天)再看字符串,一切变简单了:

```c
char *p = "Hello"; // p 指向字符串首字符 'H'

*p → 'H' // 首字符
*(p+1) → 'e' // 下一个字符
*(p+4) → 'o' // 第5个字符
*(p+5) → '\0' // 结束符
```

遍历字符串的标准写法:
```c
while (*p != '\0')
{
printf("%c", *p);
p++;
}
```

2.3 常用字符串函数(`<string.h>`)

| 函数 | 作用 | 例子 |
|------|------|------|
| `strlen(s)` | 返回长度(不含 `\0`) | `strlen("Hi")` → 2 | string length
| `strcpy(dst, src)` | 把 src 复制到 dst | `strcpy(a, b)` | string copy
| `strcmp(a, b)` | 比较两个字符串 | 相等返回 0,a<b 返回负数 | string compare
| `strcat(dst, src)` | 把 src 拼接在 dst 后面 | `strcat(s, "!")` | string concatenate

2.4 fgets 代替 gets

```c
// gets(str); ← 危险!可能溢出,C11已移除

char str[100];
fgets(str, sizeof(str), stdin); // ★ 安全:限制了最大读取长度

// 注意:fgets 会保留末尾的换行符 '\n',如果不需要,手动去掉:
str[strcspn(str, "\n")] = '\0';
```

2.5 字符分类函数(`<ctype.h>`)

| 函数 | 判断的是什么 |
|------|-------------|
| `isupper(c)` | 大写字母 A-Z |
| `islower(c)` | 小写字母 a-z |
| `isdigit(c)` | 数字 0-9 |
| `isspace(c)` | 空白字符(空格、\t、\n) |
| `isalpha(c)` | 字母(大小写都算) | alphabetical

三、阅读任务(60分钟)

| 章节 | 内容 | 重点 |
|------|------|------|
| §4.1-4.3 | 字符串入门、`strlen`、常量和预处理器 | ★★★ |
| §11.1 | 字符串与字符串函数 | ★★★ |
| §11.2 | 字符串输入 | ★★ |
| §11.3 | 字符串输出 | ★★ |

四、动手练习(50分钟)

练习1:自己实现 strlen

```bash
gcc ex1_strlen.c -o ex1_strlen.exe
./ex1_strlen.exe
```

重点对比:`strlen()` 和 `sizeof()` 的返回值差 1。

练习2:字符串统计

```bash
gcc ex2_string_stats.c -o ex2_string_stats.exe
./ex2_string_stats.exe
```

输入一个带大小写字母和数字的字符串(如 `Hello2026 World`),观察统计结果。

练习3:字符串反转(双指针)

```bash
gcc ex3_reverse_string.c -o ex3_reverse_string.exe
./ex3_reverse_string.exe
```

纸上追踪:画出 `"ABCD"` 反转时每一轮 left 和 right 的变化。

五、自由实验(30分钟)

实验1:判断回文

写一个函数判断字符串是否为回文(正读反读一样,如 `"level"`)。用第10天学的双指针。

实验2:大小写转换

输入一个字符串,把所有大写字母转小写,小写转大写。

六、今日自检

- [ ] 知道字符串 = `\0` 结尾的 char 数组
- [ ] 能区分 `strlen` 和 `sizeof`
- [ ] 知道为什么要用 `fgets` 而不是 `gets`
- [ ] 能自己写 strlen 函数
- [ ] 三个练习全部运行成功

七、明天预告

第12天:全面复习 + 10道综合练习题— 独立写代码,不看书。