【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现

目录

字符串拷贝函数(strcpy)

函数原型

应用实例

我们将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。

缺点

内存拷贝函数(memcpy)

函数原型

应用实例

 我们依然将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。

这次我们试试整型数组能不能拷贝过去。 

memcpy的模拟实现(my_memcpy)

实现样例

首先观察它形式

我们依葫芦画瓢,也写出类似的函数形式。 

具体实现


字符串拷贝函数(strcpy)

函数原型

由图可知,strcpy的形参是(目的地址,来源地址),返回值为char *。

应用实例

我们将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[10] = "abcdefg";
	char brr[10] = { 0 };
	strcpy(brr, arr);
	printf("%s", brr);
	return 0;
}

缺点

如果不是字符类型,还能这样拷贝吗?

 

我们发现,编译器直接报错了,因为形参跟实参不兼容。 strcpy具有局限性,只能适用于字符类型的拷贝。我们想要任意类型的都能实现拷贝,那怎么办呢?我们可以使用内存拷贝函数,不管三七二十一,你在这个内存单元上,我就把你拷贝过去,这样便实现了任意类型的拷贝 。

内存拷贝函数(memcpy)

函数原型

由图可知,memcpy的返回类型是void*,它的形参是(目标地址,需要复制的地址,字节大小)

应用实例

 我们依然将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[10] = "abcdefg";
	int ret = strlen(arr);//求出字符串的长度
	char brr[10] = { 0 };
	memcpy(brr, arr,ret*sizeof(char));//字节数=个数*数据类型大小
	printf("%s", brr);
	return 0;
}

这次我们试试整型数组能不能拷贝过去。 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int brr[10] = { 0 };
	memcpy(brr, arr, 10*4);//字节数=个数*数据类型大小
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", brr[i]);
	}
	return 0;
}

成功了,这说明memcpy的适用范围强于strcpy,那么memcpy是怎么实现的呢?

memcpy的模拟实现(my_memcpy)

实现样例

void* my_memcpy(void* dest, void* src, size_t count)
{
    void* ret=dest;
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

首先观察它形式

我们依葫芦画瓢,也写出类似的函数形式。 

void* my_memcpy(void* dest, void* src, size_t count)

具体实现

因为我们用的都是void*来接受参数,目的是保证兼容性(毕竟你不知道使用者使用的时候用的是什么数据类型),但计算机不知道void*指的是什么,所以需要强制类型转换。而强制类型转换,换成什么类型好呢?如果我们用int型,我们知道一个int元素占4个字节,那我们需要复制3个字节的东西咋办?所以,我们用只占一个字节的char型。

*(char*)dest = *(char*)src;

在拷贝完一个字节之后,指针向后移动一个字节

dest = (char*)dest + 1;
src = (char*)src + 1;

那么我们如何控制拷贝多少个字节呢?用while搭配count就行。

while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}

函数运行完了,我们随便返回一个值就行。

return 0;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值