Fork me on GitHub

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

 

 

posted @ 2012-12-25 11:48  Gifur  阅读(1017)  评论(1编辑  收藏  举报
TOP