字符串函数模拟实现

模拟实现memove

//模拟实现memmove函数

void* my_memove(void* arr1, const void* arr2, int sz)
{
	//abcdefghijk 这里要分前后拷贝
	void* left = arr1;
	//如果 arr1<arr2那么就从前向后拷贝
	if (arr1 < arr2) 
	{
		while (sz--)
		{
			*(char*)arr1 = *(char*)arr2;
			arr1 = (char*)arr1 + 1;
			arr2 = (char*)arr2 + 1;
		}
	}
	if (arr1 > arr2)//这里应该要从后向前拷贝
	{
		arr1 = (char*)arr1 + sz-1;
		arr2 = (char*)arr2 + sz-1;
		while (sz--)
		{
			*(char*)arr1 = *(char*)arr2;
			arr1 = (char*)arr1 - 1;
			arr2 = (char*)arr2 - 1;
		}
	}
	return left;
}

int main()
{
	//char arr1[50] = "abcdefghijk";
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memove(arr1, arr1+2, 20);
	//printf("%s\n", arr1);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

模拟实现memove函数,在实现自我拷贝的时候主要解决掉错误覆盖问题,比如abcdefghijk,要把abc复制到bcd的位置,如果我把a复制到了b上,那么b就被覆盖了,等我想要拿b的时候它已经变成a了。话不多说直接上图

 当dest再src前面的时候,应该从前向后拷贝(针对dest目标区域来说)就是先把3给1,4给2,这样当5给3的时候3已经用过了,所以被覆盖没有任何问题。

但是像这里,如果我先把7拷给了5,6拷给了4,那么当我想把5拷给3的时候你就会发现5已经换成了7,这就导致错误覆盖,无法实现自己想要的结果。

总结:简单来说,当dest<src的时候,从前往后拷贝,如果dest>=src从后往前拷贝。

模拟实现memcpy函数

//模拟实现my——memcpy函数
void* my_memcpy(char* arr1, char* arr2, int sz)
{
	char* start = arr1;
	arr2 += sz-1;
	while (*arr2 != '\0')
	{
		*arr1 = *arr2;
		arr1++;
		arr2++;
	}
	return (void*)start;
}

int main()
{
	char arr1[50] = "you are so lucky!";
	char arr2[50] = "yes i am";
	my_memcpy(arr1, arr2, 5);
	printf("%s\n", arr1);
	return 0;
}

 memcpy函数,指定字节数,把arr2的内容固定长度拷贝给arr1.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值