(C++面试题)请实现strcpy、memcpy函数

来源:互联网 发布:淘宝女装销量排行榜 编辑:程序博客网 时间:2024/05/16 23:50

关于strcpy、高质量C++给的答案是

char* strcpy(char *dst,const char *src)  {      assert(dst != NULL&&src != NULL);     char *ret = dst;      while((* dst++ = * src++) != '\0')           ;      return ret;  }  
然而这种实现没有考虑到dst与src重叠的情况,以下情况下会发生崩溃

char str[10]="abc";  strcpy(str+1,str);  
因此strcpy的正确实现应该为

char *strcpy(char *dst,const char *src)  {      assert(dst != NULL);      assert(src != NULL);      char *ret = dst;      memcpy(dst,src,strlen(src)+1);      return ret;  }  
系统memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝

自定义memcpy实现(不考虑内存重叠)

void* memcpy(void*dst,const void* src,size_t count){
    if(dst == src)
       return src;
    assert(NULL!=dst&&NULL!=src);
    void* ret = dst;    while(count--)
    {    <span style="white-space:pre"></span>*(char *)dst = *(char *)src;   <span style="white-space:pre"></span>dst = (char *)dst+1;    <span style="white-space:pre"></span>src = (char *)src+1;    }    return ret;}

另一种memcpy实现,考虑到内存重叠的情况

void * my_memcpy(void *dst,const void *src,unsigned int count){     assert(dst);     assert(src);     void * ret = dst;     if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝 { while(count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else//源地址和目的地址重叠,高字节向低字节拷贝 {  dst = (char *)dst + count - 1; src = (char *)src + count - 1;  while(count--)  { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; }    }return ret;}

如果是笔试可以简写成(都用高字节向低字节拷贝)

void * my_memcpy(void *dst,const void *src,unsigned int count)  {  
     if(dst == src)// 相同 不拷贝
       return dst;     assert(dst);       assert(src);       void * ret = dst;        dst = (char *)dst + count - 1;       src = (char *)src + count - 1;        while(count--)         {               *(char *)dst = *(char *)src;               dst = (char *)dst - 1;               src = (char *)src - 1;         }         return ret;  }  







<pre name="code" class="cpp">
                                             
0 0
原创粉丝点击