zoukankan      html  css  js  c++  java
  • strcpy、strncpy、memcpy、memove的区别

    char *strcpy(char *dest, const char *src);

    1.将src所指的字符拷贝到dest所指的空间内,直到拷贝完''后停止拷贝

    2.dest所指的空间和src所指的空间不能有重叠,否则会相互覆盖。不能达到预期。

    3.dest所指的空间要足够容纳src的所有字符,包括最末尾的''。否则将会越界。

    4.拷贝以src所指空间末尾的''为结束条件,因此将有可能导致出现越界,空间重叠的问题。

    大致实现:

    const char* myStrcpy(char *dest, const char *src)
    {
        assert(dest != NULL && src != NULL);
        char *pBegin = dest;
        while ((*dest++ = *src++) != '')
            ;
        return pBegin;
    }

    char *strncpy(char *dest, const char *src, size_t n);

    1.从src所指的空间内拷贝n个字符到dest的空间内。

    2.如果src不足n个字符,那么就用''凑齐n个字符拷贝到dest内。

    3.如果n个字符里面没有'',那么dest空间内将没有''

    4.dest空间要足够容纳n个字符,否则将出现越界

    大致实现:

    char *myStrncpy(char *dest, const char *src, int n)
    {
        int i = 0;
        for (i = 0; i < n && src[i] != ''; ++i)
        {   
            dest[i] = src[i];
        }
                                                                                                                                              
        for (; i < n; ++i)
        {
            dest[i] = ''; 
        }
        return dest;
    }

    void *memcpy(void *dest, const void *src, size_t n);

    1.从src所指的空间拷贝n个字节到dest所指的空间内。

    2.和strncpy的区别是不会遇到''就停止后续的拷贝

    3.n设置不当有越界的可能行

    4.内存不能重叠,否则相互覆盖

    void *memmove(void *dest, const void *src, size_t n);

    1.和memcpy的功能类似

    2.允许src和dest所指的空间内存有重叠,能预期实现拷贝。

    大致实现:

    char *myMemmove(char *dest, const char *src, int n)
    {
        char *pBegin = dest;
        if (src > dest)
        {                                                                                                                                     
            while(n--)
            {
                *dest++ = *src++;   
            }   
        }
        else if(src < dest)
        {
            while(n--)
            {
                *(dest-1+n) = *(src-1+n);
            }
        }
        return pBegin;
    }
  • 相关阅读:
    Gitblit 的安装使用
    PLSQL 美化规则文件详解
    SQL Server Agent的作用
    使用C#创建Widows服务
    关于VS编译DevExpress默认产生几个多余的语言包的问题解决
    (转)查询A、B表中,A表中存在B表不存在的数据
    子类构造、析构时调用父类的构造、析构函数顺序
    ACCDB与MDB的读取区别
    vue中如何动态添加readonly属性
    windows下生成文件夹目录结构
  • 原文地址:https://www.cnblogs.com/jialin0x7c9/p/14202986.html
Copyright © 2011-2022 走看看