首页 > 代码库 > strcpy 和 memcpy自实现

strcpy 和 memcpy自实现

  都是套路,详见代码注释:

#include <stdio.h>
#include <assert.h>
#include <iostream>

using namespace std;

char* myStrcpy(char *dest, const char *sour)
{
     assert(dest != NULL && sour != NULL);//断言dest 和 sour都不为空,如果为空将会报错
     char *ret = dest;//函数实现复制功能本身可以不用返回参数,这里是为了使用链式结构,返回char*。比如:int len = strlen(myStrcpy(str1,str2))
     while((*dest ++ = *sour++) != \0);
     return ret;
}

//函数原型:定义在string.h中 也是拷贝字符串用的。size个字节拷贝到目的内存起始的地址中。小心使用也是可以用来复制各种数据类型的。
//void *memcpy(void *dst, const void *src, size_t n);
//If copying takes place between objects that overlap, the behavior is undefined.
//对于地址重叠的情况,该函数的行为是未定义的。
//标准库中实现了memmove函数,该函数可以实现无内存重叠,功能是把源字符串拷贝到buff中,然后在写入到目的字符串中,增加了不必要的开销。
void *myMemcpy(void *dst, const void *src, size_t size)
{
     assert(dst && src);
     char *psrc;//记录src地址
     char *pdst;//记录dst地址
//s------- size-----c
//      d-----s--------t
     if(src < dst && (char *)src + size > (char *)dst ){
          psrc = (char*)src + size - 1;
          pdst = (char*)dst + size - 1;
          while(size --){
               *pdst -- = *psrc --;
          }
     }else{
          psrc = (char *)src;
          pdst = (char *)dst;
          cout<<psrc<<endl;
          while(size --){
               *pdst ++  = *psrc ++;
          }
     }
     return dst;
}

int main()
{
     char str [10] = "abc";
     char dst[10] ;
     int s[10] = {1,2,3};
     int d[10];
     myMemcpy(dst, str, 2);
     dst[2] = \0;
     puts(dst);
     myMemcpy(d, s, 3 * 4);
     cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
     return 0;
}

 

strcpy 和 memcpy自实现