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!

在main函数当中,先写出下列代码,用两种不同的方式来定义实现字符串数组:

 

请完成以下编程或者回答相应的问题。

题目一:

请分别遍历 fruits1fruits2这两个字符串数组,输出每个字符串的内容及其长度。

题目二:

请分别将两个字符串数组中的第一个字符串,修改成"orange"。

首先你需要回答:基于"="运算符直接赋值修改,能不能完成这样的操作?如果不能为什么?

提示:通过一定的手段,两个都可以完成修改。参考代码仅提供一种实现方式,若你能够实现,亦可采用自己的实现。

题目三:

请分别将两个字符串数组中的第二个字符串"banana"中的第一个字符'b',修改成'B'。

首先你需要回答:基于"="运算符直接赋值修改,能不能完成这样的操作?如果不能为什么?

提示:通过一定的手段,两个都可以完成修改。参考代码仅提供一种实现方式,若你能够实现,亦可采用自己的实现。

题目四:

请自行定义初始化一个字符串数组fruits3,使得这个字符串数组既可以通过"="直接修改整个字符串的内容,也可以利用"="修改某个字符串的某个字符。

提示:实现方式不唯一,参考代码仅提供一种实现参考。

参考的回答和参考的代码如下:

题目一:

就是简单普通的打印字符串数组内容,且输出字符串长度。

题目二:

能否可以直接使用 = 修改字符串?

  1. fruits1[0] = "orange"; 不允许,因为 fruits1[0] 是数组名,数组名是不能用"="重新赋值的。

  2. fruits2[0] = "orange"; 允许,因为 fruits2[0] 就是一个指针元素,指针是可以用"="改变指向的。

既然"fruits1[0]"就是一个数组,不能用"="赋值,那么就可以考虑用字符串复制操作来修改它整体的内容,当然要确保复制不能出现越界。

参考代码如下:

题目三:

能否可以直接使用 = 修改字符串的某个字符呢?

  1. fruits1[1][0] = 'B'; 允许,因为二维数组实现的字符串数组,其内存空间直接申请在栈上,可以随意修改内容。

  2. fruits2[1][0] = 'B'; 不允许,因为指针元素指向的是字符串字面值,是一个常量,不能够被修改。

fruits2[1][0] = 'B'; 不允许是因为fruits2[1]指针指向的是一个字面值常量,所以想要修改必须先要改变指向才行,比如指向一个自身栈区的字符串。

参考代码如下:

题目四:

分析:这样的字符串数组,显然只能用指针数组的方式来实现,而且指针指向的应该是自身栈区。

参考代码如下:

以上。

命令行参数与字符串类型的转换

Gn!

请你通过命令行参数传递额外的三个参数:

10 8.8 hello

其含义如下:

  1. 第一个额外命令行参数10:整数10

  2. 第二个额外命令行参数8.8:浮点数8.8

  3. 第三个额外命令行参数hello:就是字符串hello

关于如何传递命令行参数,在Windows环境下可以有两种选择:

  1. 直接在集成开发环境VS当中传递命令行参数。

  2. 在Windows的命令行,也就是CMD黑窗口中启动程序,传递命令行参数。

关于这两种方式,具体如何来完成,请参考文档:《字符串》当中的《命令行参数》小节。

请你完成下面的操作:

题目一:

先输出一下当前命令行参数的个数,再循环打印一下命令行参数字符串数组,输出的格式你可以自己来决定。

题目二:

使用sscanf函数将两个额外的命令行参数,转换成它们对应的基本数据类型(int和double)。

题目三:

在完成前两个命令行参数的类型转换后,请计算它们之和。

然后利用sprintf函数,加上最后一个命令行参数字符串,按照下面的格式来构建字符串并输出到字符数组中:

"10 + 8.8 = 18.80hello"

最后打印这个字符数组表示的字符串。

一个参考的代码输出如下图所示:

命令行参数与字符串类型的转换-演示图

参考代码如下:

以上。

扩展题篇

Gn!

以下题目都属于扩展题。

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

Gn!

第一题:

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

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

第二题:

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

参考代码如下:

参考代码如下:

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

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

以上。

扩展:字符串字符分组

Gn!

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

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

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

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

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

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

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

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

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

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

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

参考代码:

以上。

The End