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
================================================================================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)