面试题 实现memmove函数

来源:互联网 发布:直销矩阵制示意图 编辑:程序博客网 时间:2024/05/16 12:00

【题目】

   用C语言实现函数void *memmove(void *dest, const void *src, size_t n)。memmove函数的功能死拷贝src所指向内存内容前n个字节到dest所指的地址上。

【例子】

   源字符串是hello word!,要求目标字符串也是helloword!。

【分析】

   作为公用库函数,请注意安全检查,注意处理内存区重合的情况。代码本身比较简单。

【代码】

复制代码
#include <iostream>#include <cstdio>#include <cstring>void * my_memmove( void * const dest, const char * const src, size_t n ){   // check parameters   if( 0 == n )   {      return NULL;   }   if( NULL == dest || NULL == src )   {      return NULL;   }   char * psrc = (char *)src;   char * pdest = (char *)dest;   if( pdest <= psrc || pdest > psrc + n )   {      std::cout << "forward overlapping" << std::endl;      // copy forward direction      for( size_t i = 0; i < n; i++ )      {         *pdest = *psrc;         pdest++;         psrc++;      }   }   else   {      std::cout << "backward overlapping" << std::endl;      // copy backward direction      pdest = pdest + n;      psrc = psrc + n;      for( size_t i = 0; i< n; i++ )      {         *pdest = *psrc;         pdest--;         psrc--;      }   }   return dest;}int main( int argc, char ** argv ){   char *src = new char[100];   sprintf( src, "%s", "hello world!" );   char * dest = new char[100];   memset( dest, 0, 100*sizeof(char ) );   std::cout << src << std::endl;   char * result = (char*)my_memmove( dest, src, strlen(src) );   std::cout << result << std::endl;   delete src;   delete dest;   return 0;}
0 0