C语言 - memcpy和strcpy的区别

一、memcpy()

1、memcpy函数原型

作用:将num 个字节的值从source 指向的位置直接复制到destination 指向的内存块。

void * memcpy ( void * destination, const void * source, size_t num );

参数解释:

参数 解析
destination  目标空间地址
source 待拷贝空间源地址
num 待拷贝内容字节数

 

这是官方给的例子,例举了结构体的拷贝:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Person
{
	char name[40];
	int age;
} person, person_copy;

int main()
{
	char myname[] = "Pierre de Fermat";
	/* using memcpy to copy string: */
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;
	/* using memcpy to copy structure: */
	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);

	system("pause");
	return 0;
}

运行结果:

 

 

2、实现memcpy函数

看完官方文档,我想我们可以自己尝试实现一下这个功能

void* My_memcpy(void* dest,const void* src, size_t num)
{
	assert(dest && src); //断言一下,就像倒水一样,看看有没有存水空间
	void* ret = dest; //把目标首地址记下来,最后return的就是它
	while (num--)
	{	//这个操作就是一个一个复制
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret; //返回目标首地址
}

 

3、memcpy的使用

<1> 第一种用法

描述:将指定长度的字符串复制到目标字符串。(有长度限制)

参数:memcpy(target, str , sizeof(char) * n)

解释:将字符串str的前n个字符复制到target中。

其实这里 sizeof(char) * n 可以直接写成 n,因为一个字符占一个字节

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char target[100] = {""};
	char str[] = "I am handsome";
	memcpy(target, str, 7);
	printf("复制之后的结果:%s\n",target);

	system("pause");
	return 0;
}

运行结果:

 

<2> 第二种用法

描述:将指定区间的字符复制到目标字符串。

参数:memcpy(target, str + n1 , sizeof(char) * n2)

解释:将str中从第3个字符开始的连续5个字符复制到target中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char target[100] = {""};
	char str[] = "I am handsome";
	memcpy(target, str + 2, sizeof(char) * 5);
	printf("复制之后的结果:%s\n",target);

	system("pause");
	return 0;
}

运行结果:

 

<3> 第三种用法

描述:将指定长度的字符覆盖到到目标字符串。

参数:memcpy(target, str , sizeof(char) * n)

解释:将字符串str的前n个字符覆盖到target中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char target[] = "I am handsome";
	char str[] = "*****";
	memcpy(target, str, sizeof(char) * 5);
	printf("复制之后的结果:%s\n",target);

	system("pause");
	return 0;
}

运行结果:

 

<4> 第四种用法

描述:将指定长度的字符覆盖到到目标字符串的指定位置

参数:memcpy(target + 2, str , sizeof(char) * 2)

解释:将字符串str的前2个字符覆盖到target从第三个开始的位置出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char target[] = "I am handsome";
	char str[] = "*****";
	memcpy(target + 2, str, sizeof(char) * 2);
	printf("复制之后的结果:%s\n",target);

	system("pause");
	return 0;
}

运行结果:

 

 

 

二、strcpy()

1、strcpy函数原型

作用:destination是目标字符串的地址,source是源字符串的地址。函数将源字符串(包括结尾的'\0')复制到目标字符串的内存中,并返回指向目标字符串的指针。

char* strcpy(char* destination, const char * source);
参数 解释
destination 目标字符串的地址
source 源字符串的地址

2、实现strcpy函数

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

void MyStrcpy(char* dst, const char* src)
{
	while (*src)
	{
		*dst = *src;
		++src;
		++dst;
	}
	*dst = '\0';
}
int main()
{
	char p1[] = "abcdef";
	const char* p2 = "hello";
	MyStrcpy(p1, p2);
	printf("%s\n", p1);
	printf("%s\n", p2);
	return 0;
}

3、strcpy的使用

<1> 第一种用法

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

int main()
{
	char p1[] = "abcdef";
	char* p2 = "hello";
	strcpy(p1, p2);
	printf("%s\n", p1);
	printf("%s\n", p2);
	return 0;
}

运行结果:

<2> 第二种用法

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char name[25] = "";

	strcpy(name, "张三");

	printf("%s\n", name);

	system("pause");
	return 0;
}

运行结果:

 

<3> 第三种用法

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char name[25] = "";
	char tempname[25] = "张\0三abc123";//strcpy只能拷贝字符串,遇到’\0’就结束拷贝

	strcpy(name, tempname);

	printf("%s\n", name);

	system("pause");
	return 0;
}

运行结果:

 

三、strcpy和memcpy区别

(1)memcpy用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度;

(2)strcpy只能拷贝字符串,遇到’\0’就结束拷贝。

 

================================================================================

参考链接: https://www.cnblogs.com/codemagiciant/p/17544881.html

参考链接:https://blog.csdn.net/m0_70832728/article/details/132011598?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_utm_term%7ECtr-2-132011598-blog-5275612.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_utm_term%7ECtr-2-132011598-blog-5275612.235%5Ev43%5Epc_blog_bottom_relevance_base1&utm_relevant_index=5

================================================================================

posted @   [BORUTO]  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示