• 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

  • 相关阅读:
    利用AspNetPager控件实现数据分页(存储过程)
    System.Reflection
    规范管理提高效率——国内主要api接口文档工具盘点
    文件管理命令
    操作系统磁盘分区
    实体类配置(Entity)
    SpEL语法
    杂乱无章
    从struts2源码学到的技巧
    Spring基于注解的缓存配置
  • 原文地址:https://www.cnblogs.com/scdyxcc/p/2838621.html
Copyright © 2020-2023  润新知