vlambda博客
学习文章列表

这个C语言题目究竟谁该背锅?竟然是它。。。

问题来源

      各位,今天给大家带来一道有问题的C语言题目,初学者犯这种错误的可能性不小,大家来看一下这应该是谁的锅呢?问题代码如下:




1
代码分析
这个C语言题目究竟谁该背锅?竟然是它。。。


代码分析

      其实这段代码是比较简单的,意图是定义一个 del_space() 函数,用于删除字符串中的空格。在 main() 函数中传递给 del_space() 函数的是“Hello All Time!”,预期输出应该是 “HelloAllTime!”,但实际的输出的确是HelloAllTime!e!”,看下面的图:

这个C语言题目究竟谁该背锅?竟然是它。。。


这到底是哪里出了问题呢?


2
代码修改
这个C语言题目究竟谁该背锅?竟然是它。。。


代码修改

这位小伙伴自己琢磨了半天,以为是函数里用一个变量str导致的,因此他创建了一个30字符的临时数组,最后再把a复制到str,修改如下:

这个C语言题目究竟谁该背锅?竟然是它。。。


修改过后的程序运行结果如图:


这个C语言题目究竟谁该背锅?竟然是它。。。


我们可以发现修改过后程序的确可以按照要求输出了 “HelloAllTime!”,但这真是问题的真正原因吗?其实不是的。

这个C语言题目究竟谁该背锅?竟然是它。。。


3
原因解析
这个C语言题目究竟谁该背锅?竟然是它。。。


原因解析

      回答这个问题之前我们先明确一个大家都知道的基础知识:字符和字符串的区别,‘h'表示字符h,占一个字节,而“h"为字符串h,加上空字符一共两个字节,也就是说字符串都是以空字符结尾。这道题问题其实就出在这里, del_space() 函数中的目标 str 没有指定结束字符空字符,删掉两个空格后原str中的最后两个字符e和!还在,而!后面才是空字符,因此打印字符串时候到空字符才停止,所以该背锅的因该是空字符,修改很简单,最后追加空字符就可以了,如下:

这个C语言题目究竟谁该背锅?竟然是它。。。

这个C语言题目究竟谁该背锅?竟然是它。。。

写在最后:

                 通过这道题,我们可以看出出错的地方往往是最不起眼的地方,所以在编程语言的学习中,细节同样很重要,一点一滴都不能放过,否则你将付出十倍的精力来处理它,请大家牢记!



这个C语言题目究竟谁该背锅?竟然是它。。。

欢迎大家留言区讨论哦!

Wink !

往期精彩回顾





















空指针 到底是什么意思?