好
,接下来 我们要学习的是我们第三种情况
,那么是删除中间的星号
,我们再给大家讲
,这次考试 很多同学会抽到我们的星号题
,那么如果今天这节课 能够掌握好
,我跟你说
,你24分得到了 得到这24分
,你还能不及格吗
,不可能的
,我们看看 我们这个删除中间的星号
,中间的星号怎么删除了
,那么我们的方法是这样的
,我们来一个指针 定位到这个地方来
,跟刚刚那个题目有点接近
,然后来一个指针 定位到这个地方来
,这两个指针定位好了以后
,接下来我们这个 当我们的p小于等于q时
,等于这个条件
,那么如果我们的*p它不等于我们的*号
,不等于*号
,我们就把它存到我们这个新的数组里面来
,那么来一个a数组
,我们等于我们这个*p++
,*p
,我们下面会有个p++的
,咱们想一下 是不是这个思路可以
,第一步 先把我们指针定位好
,定位好了以后
,当我们p小于q 然后如果我们取了这个*q
,不等于*号 就把这个字符存起来
,对不对
,那么这里还有一个小问题就是
,我们前面的*号和后面的*号还没有保留
,那么这里还有一点点小麻烦
,那么咱们怎么办
,咱们想想这个问题
,这里我这个方法感觉有点麻烦
,我看一眼这个答案
,因为我感觉我的方法比较麻烦一点了
,我们哪一个是的
,咱们看一下
,哪个里面有这个
,我感觉我那个方法有点复杂了
,这个是吧
,将字符串尾部的 尾部的不行
,
前导和尾部的
,其它的空格 这个
,这个 那么它这个方法也不是很容易
,咱们看一看 它这个方法
,基本上跟我刚才说那个方法是相同的
,我看一眼 基本上是相同的
,基本上相同的
,思路基本上是一样的
,我们来编一编
,那么根据刚刚我们那个思路
,我们一起来编一编
,这里我们 需要的这个东西比较多一点
,那么第一个 我们先来定义一个我们数组
,b数组
,定义这个b数组做什么事情
,把我们这个新的字符串要放进来
,这是第一个
,第二个我们需要一个尾指针
,那么*q
,那么*q我们要等于我们这个p
,那么其它的暂时我们不需要了
,不需要好了以后
,接下来我们做第一个事情
,要我们这个*号的话
,把我们前面的*号先存进去
,那么这里我们换一个吧
,这里那么我们再来定义一个变量
,int语句 我们的i等于0
,然后我们的while语句循环
,怎么做 我们看一看
,当我们这个*k等于我们*号时
,等于*号时 我们这个b[i++]
,那么等于我们这个*p++
,那么来看这地方
,咱们这个地方可不可以
,这个*p++的话
,我们前面讲过了
,先算后面
,再算前面
,那么当前这一个程序段
,我的功能是这样的一个情况
,把这个p 定位到我们这个
,左边的第一个非*号
,
第一个功能
,第二个功能
,把前面的*号 存储到我们的数组b中
,这个地方我们这一个语句
,其实实现了两个功能
,咱们看一看可不可以
,我们运行完这个循环以后
,我们的p应该是停在哪里
,停在d上面去了
,而且同时 我把前面那个*号存到b里面来了
,那么接下来 我们是不是要从这个地方开始
,到这地方结束
,对吧
,那么结束之前的话
,我们怎么办
,先把这个q指针定位下来
,接下来我们做第二步事情
,我们while语句循环
,我们这个*q 那么它怎么办
,从右边*q的话
,结束标志停下来 不是结束标志的时候
,我们++
,那么一直定位到我们这个结束标志上面去了
,定位到结束标志上面好了以后
,这里我们干脆 简单一点也行
,还是这样来吧
,全部用指针吧
,现在我们q 定位在我们结束标志上面去
,然后我们来一个q--
,q--好了以后
,那么是不是我们这个q 来到我们这个*号上面了
,来到这个*号上面好了以后
,我们再来一个while语句循环
,感觉比我们刚刚那个答案里面这个程序复杂一点点
,那么当我们的*q 它这个等于我们*号时
,我们来一个q--
,咱们看这个地方
,等于*号的时候
,往左边走
,当它不等于*号的时候
,我们停下来
,那么最终我们这个q 是不停在这个8上面了
,对不对
,接下来我们下一步操作是这样一个情况了
,那么while语句循环 我们这一个p它小于等于q时
,
小于等于它
,那么接下来做什么事情
,把我们的这个b[i++]来等于我们的*p
,把这个*p的值
,那么这里还不行
,还要写一个 我们的*p不等于我们的*号
,就把它存到这个里面来
,咱们想一想可不可以
,来
,咱们看一看
,当我们这个p
,p在这个地方
,q在这个地方
,那我们的p 它会一直往右边走
,那这里我们还少一个语句
,我们少了一条语句
,这里我们再加一条
,++
,再来看 我们的p在这个地方
,我们的q在这个地方
,当我们p小于q 那么这个指针的所指向的位置
,如果它是一个字符串
,它们之间是可以比较大小的
,那么这里我们的q 就会比我们的p大
,它们相差几个数字
,它们的这个相差
,这个几个位置
,那么q减p就等于几
,所以这里没问题
,没问题好了以后
,我们*p不等于*号
,因为我们要把中间的*号给它删除掉
,所以当它不等于*号的时候
,把这个字符要存到我们的b里面去
,b里面前面我们已经存了一部分*号了
,这里我们把这个再存过来就可以了
,那么这就好了
,好了以后 我们最后再来一个语句
,这里我写的有点复杂了
,我们这个*q 然后我们的b[i++]
,那么等于我们的*q++
,最后一步我们的b[i]
,等于我们的0 加一个结束标志
,这个地方我做什么事情
,我要把从这个q开始
,q在这个地方 对吧
,
那么当这个q这个地方以后
,我们把后面的全部给它存进来
,那么所以这里面我们的q 还要先把它移动一下
,这里我们改一点点地方
,把这个地方改成这样一个情况
,++q 先把q往后面
,后面移一个 移到*号上面来
,再给它赋值
,明白了吗
,第一个问题是我们这个地方有个
,p小于q指的是 p的位置小于q
,这是这样的一个情况
,在我们字符串里面
,那么如果我们的q指向这个地方
,我们p指向这个地方
,那么q减p就等于3
,那么所以我们的p和q 那么是可以进行大小比较的
,这是第一个
,第二个什么
,会串成录像吗
,录像的话是收费的
,那么咱们现在这个程序 被我写的有点复杂了
,比我们答案那个程序要复杂一点点
,这里我是把每一块 都分成一个小块来完成的
,那么我们给大家注释一下
,上面这一块
,那么是把我们这个p定位好
,这一块是把我们的q
,q定位到我们这个右边
,这个第一个非*号上面去了
,这个q在这个地方
,当我们*q等于*号的时候
,q-- 这里我们看看 我写这个什么意思
,*q等于*号时 q--
,错了
,对了
,我们这个地方是这样的一个情况
,我们q定位到我们这个结束标志上面去
,这是这个地方
,而这一个是什么问题
,这个是q定位到我们这个右边
,第一个非*号
,这就完了
,然后这个语句的功能是 这个从左边这个p开始
,
到我们这个q结束
,把这个非*号存储到b里面来
,做这一个功能
,那么最后这个里面 我们这里有个错误信息
,*q 这里错了
,那么这个地方做什么事情
,把q往后的这个*号加到我们这个数组中
,最后一个
,新数组加结束标志
,这个方法看起来有点复杂了
,一会我们再看看答案里面
,它的方法比我的方法容易一点不
,当然我们通过一段一段来算的话
,这个方法应该是能够成功的
,分开来写以后我们加大括号
,没有必要这样做了
,Ctrl+F5键 我们来运行一下
,看有没有错误
,那么这里提醒我们错了
,这里我们这个Fun话要返回一个
,这里我们没有返回
,很多同学在写程序的过程中
,不喜欢去看我们下面这个错误的信息
,这个地方我们一定要学会看我们的错误信息
,这个比我的话强多了
,这个它给你的这个提示是100%的正确的
,比你问我的话要好多了
,而且还有就是说 你把一个程序有什么错误
,想要我帮你看的时候
,你要把下面的错误提示发给我看一下
,说实话
,你写一个程序
,写个一二十行代码
,然后要我给你去看一下
,我得看半天
,但如果你把下面这个给我看一下
,基本上我就能够得到什么问题了
,对吧
,这里什么问题
,这里应该是我们没有返回
,返回我们的b数组就可以了
,返回我们b数组 那么就好了
,我们再来看Ctrl+F5键 再运行一次
,那么这里还有一个错误
,第15行 双击一下我们第15行
,第15行这地方它说
,&符号
,圆括号的优先级别要高一些
,那这里我们少写了一个什么
,
&符号
,非常好
,再来一次 Ctrl+F5键 再运行
,那么这里有个警告 返回局部变量或临时变量的地址
,那么这里面我们这个b 它是个局部变量
,局部变量的这个地址
,那么返回过来
,它还错了
,这里返回不了怎么办
,这离返回不了是什么原因
,咱们想过这个问题没有
,我们得到答案是错误的
,有这个乱码了
,那么说明这里我们错了
,当我们程序出现错误的时候
,我们应该把程序 这一个分成很多个小块来解决
,我们的问题
,那例如刚刚我们所讲的这个地方
,我们是把它写到数组里面去
,那我们可以考虑一下把它删掉
,或者说我们直接把这个 这一些全部给它删掉
,那么这些全部删掉好了以后
,就相当于是把我们前面的*号给它存进去
,别的事情没做
,然后我们来运行一下
,看有没有错误信息
,一个小块一个小块的运行
,把刚刚我们剪切掉
,那咱们这地方 得到结果的话也是这么一个情况
,*号的话 有一个乱码
,那么这里说明什么
,说明我们的结束标志有问题
,那么这个地方我们的b[i]等于0
,感觉这个地方没有起作用了
,好
,我把中间这一块剪切掉
,放到别的地方去了
,那咱们先来把这个问题解决掉
,我们这个*p 那么等于*号的时候
,我们就p[i++]
,然后*p++
,那么完了以后
,b[i]的话给它加一个0
,那返回p 应该是没有错误对不对
,等于结束标志
,等于0和等于结束标志是一样的意思
,
那么这地方为什么不可以 好神奇
,再看一次
,我们还是有这个错误信息
,有同学告诉我是b[i++]
,那么这个如果写一个i++的话和写个i的话
,其实没关系
,你写个i++的话
,它也会是一样的
,你写个b[i++]
,它大不了是什么
,少保留一个字符
,它少保留一个字符
,对不对
,是不是也可以的
,咱们这地方为什么不可以
,我们看看来
,那么这里我们测不出来它这个错误在哪里
,我们再想个办法
,在这个地方 我们再来加一条语句
,我就不信它测不出来了
,我们把这个*号的这个b[i]
,我把它输出来看一看效果
,把这个输出来
,我们看一看效果
,那么这里的话还是错误的
,那么说明这里还真的有错误了
,这里我们检查不出来
,那咱们怎么办
,重新来一次
,一步一步来
,我们先来写第一个问题
,我们这个*p里面
,然后我们来一个字符数组b
,数组b定好了以后 我们这个*号我们的q
,然后等于我们的p 这个是没问题的
,很多同学担心这个问题
,不用担心
,如果你不信的话
,我输出给你看一看
,我把这个q给你输出来
,我看一看能不能输出来
,Ctrl+F5键 我们来输出一下q
,那这里我们这个返回值
,这个地方我们返回一下
,我们来运行一下 看能不能把这个q输出来
,有个警告
,不管它
,那么确实的话 没有输出来
,我们在q指向p
,为什么没有输出来 写反了
,不是gets 是puts 对不对
,