模拟实现库函数strcat--将源字符串的副本追加到目标字符串(理解内存重叠问题)

一.对库函数strcat的了解

通过在MSDN或者cplusplus网站上检索strcat
在这里插入图片描述
通过对strcat的检索,可以初步了解到strcat以下信息:
1.源头字符串不可被修
2.追加得源头字符串不能和目标重叠
3.追加得字符串来源不能来自目标字符串
4.返回类型是char* 目标地址
5.追加得字符串再目标数组中必须能存放下
6.目标地址得\0会被追加替代,追加后得字符串仍然包括\0

二.模拟实现库函数strcat

char* my_strcat(char* dest, const char* soc)
{
	//记录目标地址起始位置
	char* p = dest;
	//寻找目标地址得\0位置,即追加得起始位置
	while (*dest != '\0')
	{
		dest++;
	}
	//将soc得字符串追加至目标地址中
	while (*dest++ = *soc++)
	{
		;
	}
	return p;
}
#include<stdio.h>
int main()
{
	char arr1[50] = "abcd";
	char arr2[50] = "efgh";
	char* arr3 = my_strcat(arr1, arr2);
	printf("%s", arr3);
	return 0;
}

三.strcat的一些特殊情况

1.目标地址得\0会被追加替代,追加后得字符串仍然包括\0

在这里插入图片描述
通过调试以后可以发现:
strcat在实现时,虽然会将目标数组的\0替换,但是仍然会在结尾的时候给这个追加的数组补上\0

2.追加得源头字符串不能和目标重叠
下面通过画图来理解重叠的含义:
在这里插入图片描述
对于这种情况下,源头数据包含在目标数据内。
通过对上面的模拟实现代码的分析:
在这里插入图片描述

dest需要先找到\0的位置,然后再将(*dest++)=(*soc++)
对于判断条件while(*dest++ = *soc++),soc一直在向后移动,但是始终找不到\0的位置,无法控制条件停止,最终使程序死循环崩溃

运行结果如下:
在这里插入图片描述

另外一种情况:
在这里插入图片描述
这种情况下,目标数据包含在源头数据里。
通过对模拟实现strcat的代码分析:
在这里插入图片描述
同上述第一种情况一样,判断条件中的*soc始终无法找到\0控制条件结束循环,从而导致死循环最终程序崩溃

运行结果如下:

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值