memcpy 和 strcpy 的区别
strcpy: 所需头文件:#include<string.h>
extern char *strcpy(char *dest, const char *src,);
从源src地址开始且含有NULL(‘\0’)结束符的字符串复制到以dest开始的地址空间,函数返回指向dest的指针
strc和des所指内存区域不可以重叠且dest必须有足够的空间来存储src字符串
memcpy: 所需头文件:#include<string.h>
Void *memcpy(void *dest, const void *src, size_t n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,函数返回指向dest的指针。
source和destin所指内存区域不能重叠,如果重叠,则函数的行为不确定
memcpy 和 strcpy 的区别:
<1> 复制的内容和可复制的范围不同。strcpy仅能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
<2> 复制的方法和方式不同。strcpy不需要指定的长度,遇到被复制字符的串结束符’\0’才结束,容易溢出;而memcpy则根据第三个参数size_t n决定复制的长度
<3> 用途不同。通常在复制字符串时用strcpy,而复制其他数据类型时一般用memcpy。
<4> 如果初始时destin本身已有数据,执行memcpy后,将从头开始覆盖原有数据,但至多仅能覆盖n个字节。
#include<stdio.h> #include<string.h> int main() { char *s = "Golden Global View"; char k[20], f[20]; char t[20], r[20]; printf("原始字符串:\n"); printf("%s\n\n", s); /*-----------------------------------memcpy-------------------------------------*/ memcpy(k, s, strlen(s)*sizeof(char)+1); // strlen(s) 后 +1 是要取得s字符串中的终止符'\0' printf("将s中的字符串复制到k数组中:\n"); printf("%s\n\n", k); memcpy(f, s+7, 11*sizeof(char)+1); printf("将s中第7个字符开始的11个连续字符复制到f数组中\n"); printf("%s\n\n", f); printf("覆盖的情况,k和f数组的值可以可看上面\n"); printf("\n未+1处理覆盖的情况: "); memcpy(k, f, strlen(f)); printf("%s\n", k); printf("已+1处理覆盖的情况: "); memcpy(k, f, strlen(f)+1); printf("%s\n\n", k); /*----------------------------------strcpy-----------------------------------*/ printf("++++++++++++++++++++++++我是分割线++++++++++++++++++++++++++++++\n\n"); printf("相比之下的strcpy函数:\n\n"); strcpy(t, s); printf("%s\n\n", t); /*strcpy会把dest字符串的终止符也复制进去,这点可以联想到使用memset的情形, 一些人会滥用memset,包括我,所以我才这样说的,比如说在交换两个字符串的时 侯总觉得要在执行strcpy前要先memset一下才觉得放心,这最终会导致效率低下*/ }
Output:
原始字符串:
Golden Global View
将s中的字符串复制到k数组中:
Golden Global View
将s中第7个字符开始的11个连续字符复制到f数组中
Global View
覆盖的情况,k和f数组的值可以可看上面
未+1处理覆盖的情况: Global Viewal View
已+1处理覆盖的情况: Global View
++++++++++++++++++++++++我是分割线++++++++++++++++++++++++++++++
相比之下的strcpy函数:
Golden Global View
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)