第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道综合练习题— 独立写代码,不看书。
