本讲定位:三级最”实用”的一讲,也是编程题命中率最高的一讲。官方大纲三级知识块 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)编译运行验证,输出结果即为文中标注结果。
第一道(单选):
执行下列代码后,输出是( )
char s[10] = "hello"; cout << strlen(s) << " " << sizeof(s);A.
5 5B.5 10C.10 10D.6 10
第二道(判断):
语句
cin >> s;(s为string)可以读入一整行含空格的文本。( )
第三道(编程题):
输入一个字符串,把其中所有小写字母转成大写,其余字符不变,输出结果。
答案:第一道选 B,第二道错误。
strlen是”实际字符个数” = 5;sizeof是”这个数组占多少字节” = 10。两个完全不同的概念,这是字符串第一号考点。cin >>遇到空格就停,读一整行必须用getline。这是字符串第一号坑,也是三级编程题最常见的丢分原因。- 第三道题只要三行,但它涉及”大小写转换”这个官方点名的知识点,两种写法(
toupper和 ASCII 加减)都要会。
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出现频率很高,尤其是strlenvssizeof这道题几乎年年有。
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 个格子
由此推出三条结论: