每日一题——memcpy,strcpy,memmove的实现

本文详细对比了字符串拷贝函数strcpy与通用类型拷贝函数memcpy的功能差异,并介绍了memmove的使用场景及其实现原理。

memcpy与strcpy的区别:
1,用途不同:strcpy主要用来字符串拷贝,memcpy主要是其他类型的拷贝;
2,使用方式不同:strcpy是遇到‘\0’停止,memcpy是根据第三个参数来决定拷贝内容;

memmove:
原型:void memmove( void dest, const void* src,size_t count );
用途:从src的count个字符拷贝到dest
这里需要注意src与dest的位置关系,从而确定是正向拷贝还是反向拷贝。

实现:

//strcpy
char* strcpy(char* dest,const char* src)
{
    if ((dest == NULL) || (src == NULL))
        return NULL;
    char* strdest = dest;
    while (*src != '\0')
        *strdest++ = *src++;
    return strdest;
}
//memcpy
void* memcpy(void* dest,const void* src,size_t count)
{
    if (dest == NULL || src == NULL)
        return NULL;
    char* tempDest = (char*)dest;
    char* tempSrc = (char*)src;
    while (count--)
        *tempDest++ = *tempSrc++;
    return dest;
}
//memmove
void* Mymemmove(void* dest, void* src,size_t count)
{
    assert(dest != NULL && src != NULL);
    char* mydest = (char*)dest;
    char* mysrc = (char*)src;
    char* ret = (char*)dest;    

    if (mydest <= mysrc || mydest >= mysrc+count)   //正向
    {
        while (count--)
            *mydest++ = *mysrc++;
    }
    else
    {
        mydest += count - 1;
        mysrc += count - 1;
        while (count--)
            *mydest-- == *mysrc--;
    }
    return ret;

}
### 使用方法 - **memcpy**:`memcpy` 用于将指定数量的字节从源内存区域复制到目标内存区域。其函数原型为 `void *memcpy(void *dest, const void *src, size_t n);`,其中 `dest` 是目标内存区域的指针,`src` 是源内存区域的指针,`n` 是要复制的字节数。以下是一个使用示例: ```c #include <stdio.h> #include <string.h> int main() { char src[] = "Hello"; char dest[10]; memcpy(dest, src, strlen(src) + 1); printf("Copied string: %s\n", dest); return 0; } ``` - **strcpy**:`strcpy` 专门用于复制以 `'\0'` 结尾的字符串。其函数原型为 `char *strcpy(char *dest, const char *src);`,其中 `dest` 是目标字符串的指针,`src` 是源字符串的指针。以下是一个使用示例: ```c #include <stdio.h> #include <string.h> int main() { char src[] = "World"; char dest[10]; strcpy(dest, src); printf("Copied string: %s\n", dest); return 0; } ``` ### 区别 - **应用场景**:`memcpy` 可以用于任何类型的数据复制,而 `strcpy` 仅用于字符串复制[^1]。 - **结束标志**:`memcpy` 通过第三个参数指定要复制的字节数,而 `strcpy` 以字符串结束符 `'\0'` 作为复制结束的标志,且 `'\0'` 也会被复制到目标字符串中[^1]。 - **安全性**:由于 `strcpy` 结束点未知,容易导致缓冲区溢出,考虑安全性推荐使用 `memcpy` 或 `strcpy` 的改进版 `strncpy`;`memcpy` 需要明确知道要复制的字节数,如果源和目标内存可能重叠,需要使用 `memmove` 替代[^1][^3]。 - **效率**:在拷贝相同字节数(含 `'\0'`)时,`strcpy` 快于 `memcpy`,原因或许在于类型转换的时间消耗[^1]。 ### 应用场景 - **memcpy**:适用于复制非字符串类型的数据,如数组、结构体等。例如,复制一个整数数组: ```c #include <stdio.h> #include <string.h> int main() { int src[] = {1, 2, 3, 4, 5}; int dest[5]; memcpy(dest, src, sizeof(src)); for (int i = 0; i < 5; i++) { printf("%d ", dest[i]); } printf("\n"); return 0; } ``` - **strcpy**:适用于复制字符串。例如,复制一个字符串到另一个字符数组中: ```c #include <stdio.h> #include <string.h> int main() { char src[] = "Programming"; char dest[20]; strcpy(dest, src); printf("Copied string: %s\n", dest); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值