strcat函数解析 您所在的位置:网站首页 strcpy函数的返回值 strcat函数解析

strcat函数解析

2023-08-26 04:06| 来源: 网络整理| 查看: 265

一、认识strcat

strcat函数又被称为是字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串。 使用方式如下:

#include #include int main() { char arr1[20] = "hello "; char arr2[] = "world"; printf("%s\n", strcat(arr1, arr2)); return 0; }

库函数中strcat函数的声明是char * strcat ( char * destination, const char * source ); 经过测试,我们发现strcat的实现模式是将src中的所有字符(连同字符串最后的’\0’一起)加到dest字符串中第一个‘\0’的位置,具体一点说就是将dest中第一个’\0’替换成src的第一个字符,然后该’\0’后的字符替换成src的第二个字符,后面以此类推。 下面我们可以用调试的方式来简单验证一下这个实现方式,调试结果如下 在这里插入图片描述 在这里插入图片描述 通过对比我们可以看到,追加前后在字符串arr1中仅下标从6至11的字符发生了改变,操作机理与上述描述基本符合。 值得注意的是: 1.追加的字符串src和目标字符串dest中都必须要带有字符’\0’,并且追加字符串src必须以‘\0’结尾,否则追加过程无法顺利实现。 2.目标字符串空间必须足够大(足够容纳下追加字符串src的内容)。 3.目标空间必须可修改(前面不能加const并且不能说常量字符串)

二、模拟实现strcat

首先要确定strcat的参数(前面库函数strcat的声明中已经给出), 其次要明确实现的思路: 1.找到目标字符串中的‘\0’ 2.将字符串src追加过去(包含’\0’) 我们话不多说,直接上代码

char* my_strcat(char* dest, char* src) { int ret = dest; assert(dest && src); while (*dest) { dest++; } while (*dest++ = *src++) { ; } return ret; }

首先先看函数的主体实现部分,按照我们的实现思路, 先是用while循环将dest指向的地址移动到指向目标字符串dest中的‘\0’(这个操作就是strlen模拟实现中的指针减指针法),然后从dest当前位置依次将src中的字符拷贝给dest(strcpy模拟实现中的主体操作)。 其次再看返回值,strcat的返回值依然是目标空间的起始地址,但是此时dest指向的地址已经不是最初的地址了,因此我们引入一个中间变量ret来存储最初的地址并最终将其返回。 最后是安全性优化,我们要在函数实现的开头断言dest和ret均不是空指针,前面说过这样可以帮助使用者在出错的时候快速找到问题。 由于这个函数的实现过程和前面strlen和strcpy的实现过程有很多相似之处,故细节问题在这里不做过多解释,有疑问者可以去翻看前两篇关于疑问处的解释。strcat的实现我们就到此为止啦! 模拟实现函数strcat之后,我们初步了解了strcat的实现过程,那么下面我们提一个问题?我们能否使用strcpy函数来在一个字符串后面追加它本身呢?经过实践发现,这样做是不行的,那原因是什么呢?结合下图我们来逐步分析一下。 在这里插入图片描述 假设我们用strcat给“abcd”这个字符串拷贝它自己 第一步首先利用while循环我们将dest指向\0的地址,第二步令 *dest 等于 *src,第三步将dest和src各自加一。在第二步中,dest指向地址原本存储的字符’\0’,被改成了‘a’,接下来的拷贝中永远不会拷贝\0,拷贝过程永远也不会停止,系统崩溃,故不能使用。 好了,那么这个问题也解决了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有