C++基础教程
——
作业及参考答案全部汇总文档
节5字符串阶段作业

最新版本V2.0
王道C++团队
COPYRIGHT ⓒ 2021-2024. 王道版权所有

基础题篇

Gn!

下面都是一些基础的语法、概念编程练习题。

手动实现字符串处理库函数

Gn!

依照C语言的字符串标准库函数,手动实现以下函数:

函数的实现要模拟标准库函数中对应函数的行为,不要依据自己的理解来实现这些函数。

参考代码如下:

参考代码:

第一题参考代码如下:

第二题参考代码如下:

第三题参考代码如下:

第四题参考代码:

第五题参考代码:

第六题参考代码:

以上。

统计字符串中的数字和字母数量

Gn!

给定一个字符串,要求它可能包含数字和字母。

请编写函数,统计该字符串中每个字符出现的次数,统计过程中忽略大小写的差异,并打印最终每个字符出现的次数。

提示:

用一个int数组存储字符出现的次数,可以用一个128长度的数组,这样数组下标位置的元素就是该编码值字符出现的次数,缺点是浪费空间,但你可以先写一个这样的实现。

(扩展)做完后,你可以思考一下:

实际上只会有36个字符(10个数字和26个不区分大小写的字母),所以int数组的长度实际上只需要36就可以了。

那么怎么把数组的长度缩短到36呢?

参考代码如下:

参考代码:

基础版本以及优化版本的实现,参考代码如下:

以上。

统计字符串当中的单词数量

Gn!

编写一个函数,计算一个字符串中单词的数量。这里,单词被定义为由空格分隔的字符序列。

例如,对于字符串"hello world! word Excel space blank"

就应该输出有6个单词

注意:空格可能连续出现。

思路参考:

1.整个过程就是跳过前面的所有空白字符,先找到一个非空字符,然后再跳过所有非空字符找到一个空白字符,于是确定找到一个单词。

2.第二种思路: 遍历整个字符串,如果字符是非空格制表符,那么就是单词的一部分,继续遍历直到碰到空字符或者空格制表符,意味着单词结束,计数器加1

两种思路皆可。

参考代码如下:

参考代码:

两种思路的参考代码如下:

以上。

检查字符串中的小括号是否匹配

Gn!

编写一个函数,检查给定的字符串中的圆括号()是否正确匹配。注意只考虑小括号,字符串中没有其它括号。

如字符串:((Hello) (World))

函数会返回一个布尔值,表示匹配成功或失败

注意:只考虑英文小括号(),不需要考虑其它括号,更不需要考虑中文符号。

参考代码如下:

参考代码如下:

只考虑小括号的匹配,所以整个实现是比较简单的:

以上。

扩展题篇

Gn!

以下题目都属于扩展题。

扩展:字符串替换/删除/分组操作

Gn!

第一题:

将字符串中的空格替换成 %020 (假定原字符数组能够存放替换后的字符串)。

注意:只考虑字符串中存在空格字符,不考虑制表、换行等其它空白字符。

第二题:

删除字符串中指定的字符。

参考代码如下:

参考代码如下:

第一题,字符串替换操作,参考代码如下:

第二题:字符串删除,可以基于字符串分组来实现,参考代码如下:

以上。

扩展:字符串字符分组

Gn!

请编写函数,将字符串中的字母和数字分开,使得字符串中前一部分是数字,后一部分是字母。

注意:要求字符串只包含字母和数字,字符串的长度不超过100,且分组要最终在原数组上完成。

提供几个参考的实现思路:

1.临时数组法。用两个临时数组一个装数字,一个装字母,然后再将数据合并回原数组。

2.双指针夹逼交换法。两个指针向中间逼近,一个找字母一个找数字,找到后交换,直到两个指针相遇。

3.双指针单向分区交换法。

一个指针p用于遍历字符串,另一个指针p_num从头开始向后移动,用于标记下一个数字应该插入的位置。

p指针每发现一个数字,就把它交换到p_num位置,然后p_num指针后移。

直到遍历完字符串,所有的数字都会被交换到前面,所有字母都会被交换到后面。

最后,上面提到的双指针法,既可以用真正意义上的指针,也可以直接用索引。两者没有本质上的区别,更多是代码风格上的区别。

基于上述思想,参考代码如下:

参考代码:

以上。

The End