模拟实现库函数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
    评论
"C语言字符串处理库函数大全-简书"是一篇在简书上的教程,介绍了C语言中常用的字符串处理库函数。 该教程详细介绍了C语言字符串操作的相关函数,包括库函数的使用方法和示例代码。通过该教程,读者可以学习到如何使用C语言中的字符串处理函数来进行字符串的复制、连接、比较、查找、截取等操作。 在这篇教程中,读者可以了解到以下一些常见的字符串处理库函数: 1. strcpy:用于将一个字符串复制到另一个字符串中。 2. strcat:用于将一个字符串连接到另一个字符串的末尾。 3. strlen:用于计算一个字符串的长度。 4. strcmp:用于比较两个字符串的大小。 5. strchr:用于在一个字符串中查找指定字符的第一次出现位置。 6. strstr:用于在一个字符串中查找指定子串的第一次出现位置。 7. strtok:用于将一个字符串按照指定的分隔符分割成多个子串。 8. strncpy:用于将指定长度的字符串复制到目标字符串中。 9. strncmp:用于比较指定长度的两个字符串。 10. sprintf:用于将格式化的字符串输出到一个字符数组中。 这些函数在C语言中非常常用,并且对于字符串的处理非常方便。通过学习和掌握这些字符串处理库函数,可以更加高效地完成C语言程序中的字符串操作。 总之,"C语言字符串处理库函数大全-简书"这篇文章提供了丰富的字符串处理库函数以及示例代码,对于C语言开发者来说是一个很好的参考和学习资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值