GESP 三级 第 06 讲:字符串及其常用函数

本讲定位:三级最”实用”的一讲,也是编程题命中率最高的一讲。官方大纲三级知识块 6 写的是「字符串及其函数——大小写转换、字符串搜索、分割、替换等」,四个动作全部点名。好消息是:字符串本质上就是一个字符数组,上一讲的六个套路(遍历、统计、查找、桶、反转)在字符串上原样可用,本讲不是从零学一个新东西,而是把数组的技能搬到字符上。坏消息是:字符串自带三个 C++ 特有的坑——'\0' 结尾、cin >> 遇空格就断、char 和 string 两套体系混用。本讲的时间要压在这三个坑上。

对应官方大纲:三级知识块 6「字符串及其函数」——大小写转换、字符串搜索、分割、替换等。

前置知识:二级第 04 讲(ASCII 编码——四个必背码值 空格 32、'0' 48、'A' 65、'a' 97 必须已经背熟)、二级第 05 讲(类型转换)、三级第 04 讲(一维数组)、三级第 05 讲(数组套路——本讲全部在复用它)。

代码说明:本讲所有代码均已用 g++ 11.5(-std=c++11)编译运行验证,输出结果即为文中标注结果。


1. 先看三道真题

第一道(单选):

执行下列代码后,输出是( )

char s[10] = "hello";
cout << strlen(s) << " " << sizeof(s);

A. 5 5 B. 5 10 C. 10 10 D. 6 10

第二道(判断):

语句 cin >> s;(s 为 string)可以读入一整行含空格的文本。( )

第三道(编程题):

输入一个字符串,把其中所有小写字母转成大写,其余字符不变,输出结果。

答案:第一道选 B,第二道错误。


2. C++ 有两套字符串,先分清

char 数组(C 风格) string(C++ 风格)
定义 char s[105]; string s;
头文件 <cstring>(用函数时) <string>
长度 strlen(s) s.length() 或 s.size()
拼接 strcat(a, b) a + b(直接用加号!)
比较 strcmp(a, b) a == b、a < b(直接比!)
长度可变 ❌ 固定 ✅ 自动伸缩
结尾标记 必须有 '\0' 不用管

📌 本课程的建议:优先用 string。

理由:string 能直接用 +、==、< 比较和拼接,不用操心 '\0',不会因为数组开小了越界。官方大纲点名的四个动作(大小写转换、搜索、分割、替换)用 string 全都是一行。

⚠️ 但 char 数组必须会读——真题的”读程序写结果”里 char 数组和 strlen/strcmp 出现频率很高,尤其是 strlen vs sizeof 这道题几乎年年有。


3. char 数组:'\0' 是它的灵魂

一个字符串在内存里是”一串字符 + 一个结束标记”。 这个结束标记是 '\0'(ASCII 码 0 的字符,也叫空字符)。

char s[10] = "hello";

下标:   0    1    2    3    4     5    6  7  8  9
      ┌────┬────┬────┬────┬────┬──────┬──┬──┬──┬──┐
  s = │'h' │'e' │'l' │'l' │'o' │ '\0' │?│?│?│?│
      └────┴────┴────┴────┴────┴──────┴──┴──┴──┴──┘
                                  ↑
                            结束标记,占 1 个格子

由此推出三条结论: