字符串函数模拟实现

目录

memcpy

memmove

memcpy

void*memcpy(void*str1,void*str2,int num);

这个函数的功能有点类似于strcpy本质上是字符串拷贝函数,这里使用的是void*而不是char*或者int*的目的就是为了可以拷贝各种类型的数据,我们只需要根据我们的需求进行类型转换即可。下面附上代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void* my_memcpy(void* str1, void* str2, int num)
{
	char* p1 = (char*)str1;
	char* p2 = (char*)str2;
	char* ret = p1;

	while (num--)
	{
		*p1 = *p2;
		p1++;
		p2++;
	}
	//char* ret = p1;
	return ret;
}
int main()
{
	char str[40] = { "abcdef"};
	char arr[20] = { 0 };
	int sz = strlen(str);
	char* ret = my_memcpy(arr, str, sz);
	printf("%s", ret);
	return 0;
}

值得注意的点:

1第一行是为了跳过VS2022编译器的安全警告,比如有时候我们要把scanf写成scanf_s才可以使用,但是这样的话,代码的转移性降低在别的编译器就不能使用,所以我们使用该代码使得其跳过安全警告,这样就可以在VS中使用scanf

2我们先就写了char*ret=p1;

注意这里ret指向的其实是p1的地址,后面我们具体修改赋值p1的时候我们修改的是这块空间的内容,但是ret依然指向这块地址,所以我们可以在开头就直接定义ret

memmove

void*memmove(void*str,void*arr,int num);

这个函数的功能和Memcpy是一样的,但是这个函数的功能可以赋值相同的一块空间,比如str和arr都是一个数组ptr[10]的空间,这一点是memcpy做不到的也是如果出现了内存覆盖的时候我们必须要使用memmove

这里就出现了两种情况

1如果str的地址<arr的地址或者str的地址大于arr+num的地址,我们赋值的时候是从左向右赋值

2如果是其他的情况下,我们要从右向左赋值,这样做的目的是使得重复空间赋值可以得以实现,为了达到这个目的,我们就需要先让地址指向右边,也就是str+=num-1; arr+=num-1;然后再赋值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值