二级C等考上机辅导(选学)

官方信息技术老师·25 页·深入(追求细节与边界)·0 次浏览·2 天前
字符串C语言高频考点机试实操

二级C等考上机辅导

看完你能独立拆解六类字符串题并写出机考得分代码

按 空格/→ 演示下一步

1 / 25 页

全部页面点击任意一页,跳回舞台从这页播放

字符串C语言高频考点机试实操

二级C等考上机辅导

看完你能独立拆解六类字符串题并写出机考得分代码

1第 1 页 · 二级C等考上机辅导

为什么要学字符串处理

你在网站注册账号时,系统要检查用户名合不合法、密码够不够强、手机号格式对不对——这些背后都是字符串处理在干活。二级C的上机考题,几乎年年都会在这块出题。

命题高频
上机题里字符串题占比大,近十年几乎年年必考
题型固定
集中在输入处理、字符统计、查找替换、逆转排序四类
考核综合
数组下标、指针移动、循环嵌套一次全考到,是基本功试金石
失分重灾区
边界条件多:空串、末位\0、大小写,稍不留意就丢分
快递分拣对应 →字符串逐字符处理

每个字符像包裹,按规则逐个扫描、判断、归类

2第 2 页 · 为什么要学字符串处理

字符串的基本概念

上页我们谈了为什么要处理字符串——但'一串字符'在内存里到底长什么样?程序怎么知道它在哪里开始、到哪里截止?这一页我们把它拆开来看清楚。

字符数组
用 char 类型的一维数组存字符串,每个元素是一个字符
'\0' 结束符
字符串末尾紧跟一个值为 0 的字符,作为'到此为止'的标记
下标访问
用 str[i] 访问第 i 个字符,i 从 0 起,和普通数组一致
一排编号储物柜对应 →C 字符串的内存排布

每格存一个字符,最末格亮起'结束灯',扫描到此停步

3第 3 页 · 字符串的基本概念

字符串连接的实现

c

手写 my_strcat:用指针把 src 的内容追加到 dest 的 '\0' 之后,再逐拍展示复制过程。

代码高亮加载中…

四行核心逻辑:存起点 → 找 '\0' → 边拷边走 → 返回原地址,这正是标准库 strcat 的真实做法。

4第 4 页 · 字符串连接的实现

删除指定字符的思路

c

用两个指针分别演示原地删除与新字符串两种写法,直观看清写指针什么时候才动。

代码高亮加载中…

两种解法核心都是「读指针 i 扫源串,不是目标字符时写指针 j 才前进」,差别只在结果写回原串还是新串。

5第 5 页 · 删除指定字符的思路

基础操作自测

点击作答

手动实现字符串A+B连接时,从A的'\0'处开始依次写入B的每个字符,写完后新串末尾的'\0'从哪来?

6第 6 页 · 基础操作自测

字符查找的本质

你在一本书里找某个字——从第一页开始翻,对上就停。这「从头到尾逐个比」就是字符串查找的骨架。

遍历匹配
循环逐字符比对,找到或遍历结束即停止
标志位法
用 found=0/1 标记是否找到,区分存在与未找到
下标定位
下标记录子串起点,串长推算终点 i+len
翻书找关键字对应 →遍历匹配查找

逐页翻=遍历;遇关键字=命中;翻完不见=失败

end=start+len\text{end} = \text{start} + \text{len}
7第 7 页 · 字符查找的本质

统计字符出现次数

c

一段把单字符与子串统计合二为一的 C 程序。

代码高亮加载中…

逐位指针比对完成单字符统计;strstr 滑动找子串,p += len 跳过整段以避免重叠——这就是单/多字符统计的关键分界。

8第 8 页 · 统计字符出现次数

大小写不敏感查找

c

用 tolower 实现大小写不敏感查找,重点是参数必须强转 unsigned char。

代码高亮加载中…

`(unsigned char)` 是避免 UB 的关键——signed char 上 >127 的字节会被解释为负数,传给 tolower 触发未定义行为。

9第 9 页 · 大小写不敏感查找

典型考题解析

一道真题从文字变成能跑的代码,要走完下面这五步。

1
拆解题意
把中文描述拆成:做什么、输入什么、输出什么
2
设计接口
确定函数名、参数类型、返回值类型
3
规划算法
选择遍历方式,写下伪代码逻辑
4
写成代码
把伪代码转成 C 语句,注意语法细节
5
验证边界
用空串、单个字符、特殊情况自测
10第 10 页 · 典型考题解析

查找统计自测

点击作答

用"遍历计数"思路统计字符串s中某字符出现次数时,循环终止条件与计数动作最准确的是?

11第 11 页 · 查找统计自测

什么是字符移位

前面几页我们都在字符串里做查找、统计——字符原地不动,我们来回走。现在反过来:让字符串本身挪一挪、滚一滚。

左移
每个字符向左挪一格,最左边的字符移出后消失
右移
每个字符向右挪一格,最右边的字符移出后消失
循环移位
溢出的字符接到另一端,长度和字符数都不变
与普通移位的区别
普通移位会丢字符,循环移位首尾相接
时钟走字对应 →循环移位

12 点过后是 1 点,数字到尽头自动绕回起点,不会消失

12第 12 页 · 什么是字符移位

左移位的实现

c

对比两种左移实现:逐字符前移 vs 缓冲区法,看它们如何把 "abcdef" 变成 "cdef"。

代码高亮加载中…

方法一用循环逐个往前挪;方法二先把后半段存进 buf 再覆盖回原串。两种都要补 '\0'。

13第 13 页 · 左移位的实现

右移位的实现

c

右移位必须从串尾倒着往前搬字符,否则会把还没读到的源字符覆盖掉。

代码高亮加载中…

右移就是逐个把字符向右挪 n 位;循环必须从 len-1 倒着走到 n,否则 s[i-n] 还没读就被前面那次赋值覆盖了。

14第 14 页 · 右移位的实现

回文字符串的判定

对称性、中心扩展法、双指针法

回文字符串的判定
对称性、中心扩展法、双指针法
15第 15 页 · 回文字符串的判定

回文判断代码实现

c

输入一行文本,程序筛出字母数字、忽略大小写,再用首尾指针判断它是否为回文。

代码高亮加载中…

高亮处先去除换行,只保留 ASCII 字母数字并统一大小写;随后首尾比较,一旦不对称就输出 No,全部对称才输出 Yes。

16第 16 页 · 回文判断代码实现

移位与回文自测

点击作答

字符串“ABCDEF”右移2位后,结果是?

17第 17 页 · 移位与回文自测

字符与数字的关系

你有没有想过:'5' - '0' 为什么能算出整数 5?因为字符在内存里就是按整数存的。ASCII 表里数字字符码值连续,这就是字符与数字关系的核心。

字符本质是整数
内存里每个字符按 ASCII 码存储,如 'A' 就是 65
'0'-'9' 码值连续
相邻字符差值为 1,'7' - '2' 正好等于整数 5
'A'-'F' 衔接 '9' 之后
10-15 由六个大写字母承担,凑齐十六进制的 16 个符号
宿舍门牌号对应 →ASCII 数字段

102 与 108 相差 6 号;'2' 和 '8' 的码差也是 6

18第 18 页 · 字符与数字的关系

数字字符串转整数

c

用 C 实现 atoi:跳过空白、识别符号、逐位累加,并在累加前预判溢出,是机考常考题型。

代码高亮加载中…

L10 跳过空白;L14 用三目运算识别单符号位;L21 在乘 10 之前用 (INT_MAX-d)/10 预判溢出,比「乘完再判断」更稳妥。

19第 19 页 · 数字字符串转整数

整数转数字字符串

c

手写 my_itoa:把整数逐位拆成字符,展示『逆序存 + 反转』的经典套路。

代码高亮加载中…

高亮展示核心四步:取模 + '0' 把数字变字符、除 10 推进、补符号、双指针反转。整体思路是『逆序存,最后反转』。

20第 20 页 · 整数转数字字符串

字符串与数字的转换对比

c

用atoi和sprintf双向对照,重点看边界情况的处理

代码高亮加载中…

atoi从左到右扫描,遇非数字停止;转换失败返回0,无法区分真零和失败。sprintf按格式符把整数完整写入字符串,无截断、无歧义。

21第 21 页 · 字符串与数字的转换对比

转换类题目自测

点击作答

对字符串s[]="309"循环三次执行 `n=n*10+s[i]-'0'` 后,n的值是?

22第 22 页 · 转换类题目自测

六类题型的共同规律

  • 几乎所有操作都可归结为一次完整的遍历
  • 下标与长度关系决定边界,越界往往只差一
  • 先列正常、极值和缺失场景,再编码更稳妥
  • 把状态和变化规律理清,能减少重复与遗漏
延伸主题:数组与指针的遍历写法边界测试用例设计清单常见字符串算法复杂度
23第 23 页 · 六类题型的共同规律

字符串处理方法图谱

六类题型对应六种核心思路,先看分支、再看每类下的代表解法。

图解渲染中…
字符串处理根节点汇总全部六类题型查找统计类包含按位置查找和计数两类需求移位类左移右移共用同一套循环思路转换类字符串与整数的双向转换各一种方法
24第 24 页 · 字符串处理方法图谱

课后思考

先自己想,再看参考答案。三题分别对应回顾、应用、迁移。

1遍历字符串时那个'下标变量'到底在做什么?它和指针是同一回事吗?

参考答案下标本质是相对数组起点的偏移量。a[i] 与 *(a+i) 完全等价,编译器最终都翻译成指针算术,运行时没有区别。

2如果把题目换成'删除字符串中连续重复的字符',前面那个'检查-决策-处理'框架还能用吗?

参考答案能用。遍历框架一字不改,只把判断条件从'等于指定字符'换成'等于前一个字符'——这就是六类题的共同规律。

3若字符串里混入汉字(每个占 2~3 字节),左移/回文/查找这些算法还能直接套用吗?

参考答案不能直接套。按字节遍历会把一个汉字从中间劈开,输出乱码。需按字符宽度遍历,或换用宽字符库。

25第 25 页 · 课后思考