咱们不多废话,直接切入主题昂。书接上回呢,这一小节包括三个函数的讲解,分别是:
strcpy 函数、strcat 函数、strcmp 函数
了解一个函数的第一步,我们还是先在 Cplusplus 上来查看一下:
咱们可以看到,strcpy 是专用于进行字符串拷贝的函数,且头文件为:
#include <string.h>
使用格式也是相当的简单,我们目光锁定到这一行:
解析:
字符串的拷贝我们依靠什么去实现呢?我们可以自己思考,设想一下它的底层逻辑,一个一个的字符去替换可不可以?当然可以,这里我们直接选择用 while 函数去实现它
我们这里 while 的循环条件本来行该是(*sour != ‘ \0 ’),遇到 ‘ \0 ’ 就代表着遇到我们字符串末尾的 ‘ \0 ’ 了嘛,就拷贝完了,但是由于我们 ‘ \0 ’ 的ASCLL码值就是 0 ,所以可以直接表示为(*sour)
当我们 *sour 为 ‘ \0 ’ 的时候就会跳出循环,这个时候就完了吗?并不是的,通过调试可以看到,我们的 strcpy 函数是会拷贝原字符串中末尾隐藏的 ‘ \0 ’ 的:
所以我们既然叫模拟实现,我们自然也不能少了这一步,所以在最后,我们再进行一个赋值,将原字符串中的 ‘ \0 ’ 也拷贝上
这个代码到这里就已经是完成了,但是呢,并不完美,我们还可以进行更好的优化:
解析:
大家可以看到,我们这里在 while 循环里做出了一些改动,这是一步非常巧妙的优化:根据我们运算符的优先级,虽然我们的 ++ 是属于最高级,但是因为是后置 ++ ,我们需要进行完这一条语句的其他所有运算操作之后再来完成 ++ 运算, 所以这里就巧妙的完成了我们先赋值过去,再 ++ 移动到下一位的操作了
这时候就有同学要问了,还有没有更好的优化方案呢?OK,既然你诚心诚意的提问了,那我就大发慈悲地告诉你,还有高手!
优化二:
解析:
这里我们再次对 while 下手了,我们直接将我们的循环条件改成了这个,我们一位一位地拷贝,再 ++ 进到下一位,大家想一想,直到最后我们遇到 ‘ \0 ’ 的时候,我们是不是已经完成了对 ‘ \0 ’ 的拷贝,这一步优化非常之巧妙,是我们编程思想上的大飞跃,希望诸君可以理解,while 循环里单独放置一个 ;的意义在于这里执行循环是需要一条语句的,哪怕是空语句
这个时候就又有同学要问了,那么还有没有更好的优化呢,既然你诚心诚意的提问了,那我就大发慈悲地告诉你,没有。昂,我是不知道了哦,我想肯定会有的,但是我确实是只能优化到这个地步了,如果有诸君还想出了更好的代码,欢迎在评论区跟我留言讨论
当我们从Cplusplus中查询对比可以得出,strcpy 函数和 strncpy 函数的区别就是后者添加了一个字符长度的,这个数字表示的就是我们从字符串 arr1 中拷贝的字符数 ,使用如下:
这时候就有人要问了,要是原字符只有五个六个,但是我们想拷贝七八个怎么办?如下图:
原字符串字符不够时,自动补上 ‘ \0 ’
老规矩,咱们先来了解一下这个函数:
这里诸君可以看到,这个 strcat 函数是专用于我们字符串追加的,而且 strcat 函数的格式跟我们上面的 strcpy 函数一模一样,头文件也为
#include <string.h>
其实大家见识多了可以找到一个规律昂,就是有关于字符函数和字符串函数其头文件基本上都是这个,诸君要学会举一反三哦
其格式很简单,原理跟我们上一个 strcpy 函数也相差无几,都是遇 ‘ \0 ’ 停止:
这里不同的就是我们追加是在目标字符串的末尾开始追加,所以我们第一个 while 函数就是一直循环直到找到我们目标字符串末尾的位置,其他的没什么好说的了,跟上面 strcat 的原理如出一辙,如果有看不懂的部分,大家再去上面翻翻看昂,咱也就不过多赘述了
还有一点需要诸君注意昂,原则上来讲,我们的 strcat 函数不能自己给自己追加,就像这样:
当然啦,大家也知道 “ 原则上 ” 是什么意思,这里虽然程序是可以实现自己给自己追加的,但是只是此刻的程序没有出现问题,不代表以后不会出问题,当我们使用 strcat 函数自己追加自己的时候,可能会将源字符串中的'\0'覆盖掉,程序检索不到'\0',不会停下来,陷入死循环。所以,为了保险起见,使用strcat函数时,应该尽量避免给自己追加!!!
当我们从Cplusplus中查询对比可以得出,strcat 函数和 strncat 函数的区别也是后者添加了一个字符长度的,对于我们需要追加字符数的控制:
首先来看其在 Cplusplus 中的概念定义:
可以看到,其表现格式依旧是差不多的,strcmp 函数是用于比较两个字符串大小的,无需多言,头文件依旧是
#include <string.h>
提到字符串大小的比较,大家可能第一时间想到的是长短的比较,其实不然,如果是长短的比较那就太片面了昂,长短一样的情景很多,接下来又该如何进行区分呢?所以我们字符串之间的比较实质上是比较两个字符串中对应字符ASCLL码值的大小,且在我们上面的概念解释中可以得出:若第一个字符串小于第二个字符串,则返回一个小于 0 的数,反之可得若第一个字符串大于第二个字符串,则返回一个大于 0 的数,若完全相等,则返回 0
大家在后续自己的测试中可能会想到这样一个问题:我们每次比较返回的结果,大于就是 1 ,小于就是 - 1 ,等于就是 0 ,没有出现过其它数字,跟我们C语言概念定义的不一样,这是为什么呢?这是因为,在我们VS中,对于 strcmp 函数返回值的定义就是大于返回 1 ,小于返回 - 1 ,等于返回 0
使用情况如下:
解析:
这里我们还是通过 while 循环,一个字符一个字符的比较,若相等,则判断其中一个的字符是否走到末尾 ‘ \0 ’ 的位置,没有则更进一位,比较下一个字符,若字符大小出现区分则,则不走 while 进入下方的 if else 判断
大家可以注意到,这里我们对其返回的 ret 的值做判断,这段代码我们在 VS 上是完全没有问题的,但是诸君要知道这其实并不符合我们C语言原则上的定义,所以我们应该做出一点点优化:
我们在 My_strcmp 函数中可以不做大小比较的判断,只要相等就进一位,不等我们直接返回两个字符相减的差值,这样我们的返回值就不会局限于 1 和 - 1 ,就更加符合我们C语言对 strcmp 指定的原则
当我们从Cplusplus中查询对比可以得出,strcat 函数和 strncat 函数的区别也是后者添加了一个字符长度的,这里的是我们需要比较字符的个数:
OKK,有关于这三个库函数的讲解今天就到此为止咯,这期的内容其实都很简单,诸君都是聪明人,只需要使用几次都会理解到位的,在我们模拟实现这些函数的时候,用到的也是之前学到过的知识,今天的亮点我觉得就是那一个 while ( *dest ++ = *sour ++ ),这是一步非常之巧妙的运用,完美贴合了我们需要的编译环境,希望诸君能够理解透彻,有什么疑问欢迎在评论区或者私信跟我交流哦。最后希望诸君动动发财的小手,如果此篇文章对你有所帮助的话,不妨点点赞点点关注噢!就这样啦,咱们下期再见,与诸君共勉!!!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务