C语言 strcpy和memcpy源码实现

一、memcpy三个函数在使用过程中,均需包含以下头文件:


//在C中
#include <string.h>
//在C++中
#include <cstring>

二、memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中。实现如下:

 void* memcpy(void *dst,const void *src,size_t count)
 {
     void* ret = dst;
     while (count--)
     {
         *(char*)dst = *(char*)src;
         dst = (char*)dst + 1;
         src = (char*)src + 1;
     }

     return ret;
 }

源代码比较简单,定义一个计数,然后从头到尾一次将src指向的值拷贝给dst,库函数中的memcpy不能处理dst和src中存在重叠部分这种情况。

那么处理重叠部分的话,我们可以采用从后往前依次拷贝的方法,下面给出我修改过的函数代码:

 void* memcpy(void* dst, const void* src, size_t count)
 {
     char *pDst = static_cast<char *> (dst);
     const char* pSrc = static_cast<const char*>(src);
     if (pDst == NULL || pSrc == NULL || count <=0)
     {
         return NULL;
     }

     if (pDst > pSrc && pDst < pSrc + count)
     {
         for (size_t i = count - 1; i>=0;i--)
         {
             pDst[i] = pSrc[i];
         }
     }
     else
     {
         for (size_t i = 0;i <count;i++)
         {
             pDst[i] = pSrc[i];
         }
     }

     return pDst;

 }

三、strcpy是C语言的标准库函数,使用strcpy需要包含以下头文件:


#include <string.h>
#include <stdio.h>

其函数功能是把从src地址开始且含有NULL结束符的字符串复制到dst开始的地址空间,返回指向dst的指针。其函数代码如下:

 char* strcpy(char *dst,char *src)
 {
     if (dst == NULL || src == NULL)
     {
         return NULL;
     }
     if (dst == src)
     {
         return dst;
     }

     char* ret = dst;

     while ((*dst++ = *src++) != '\0')
     
    return ret;
 }

strcpy和memcpy的不同点
这个也是常见的考点,主要分为以下三点不同:

复制内容不同:strcpy只能复制字符串,而memcpy可以复制任何内容,例如字符数组,整型,结构体等

复制的方法不同:strcpy不需要指定长度,它遇到字符串结束符’\0’才结束,所以容易溢出。memcpy则需要传入第三个参数来指定长度

用途不同:通常在复制字符串的时候用strcpy,而需要复制其他数据类型的时候则一般用memcpy。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值