strcat函数解析

一、认识strcat

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

#include<string.h>
#include<stdio.h>
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,拷贝过程永远也不会停止,系统崩溃,故不能使用。
好了,那么这个问题也解决了。

  • 80
    点赞
  • 365
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值