strcpy、strncpy、memcpy、memove的区别

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

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

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

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

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

大致实现:

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

 

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

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

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

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

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

大致实现:

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

 

 

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

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

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

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;
}

 

posted @ 2021-01-28 15:51  只取一瓢饮  阅读(330)  评论(1编辑  收藏  举报