面試題之實現系統函數系列一:實現memmove函數

編譯環境

   本系列文章所提供的算法均在如下環境下編譯經過。 linux

【算法編譯環境】Federa 8,linux 2.6.35.6-45.fc14.i686
【處理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【內存】 2025272 kB
ios

前言

    在面試筆試當中,讓面試者本身實現某些庫函數也是數見不鮮。下面要講的一個算法來自百度的面試題。memove函數是C語言裏面的一個標準庫,包含在頭文件裏。要是先這樣一個算法,須要考慮目標字符串和源字符串邊界重疊的狀況。 面試

    本系列文章均系筆者所寫,不免有一些錯誤或者紕漏,若是小夥伴們有好的建議或者更好的算法,請不吝賜教。 算法

正文

【題目】

   用C語言實現函數void *memmove(void *dest, const void *src, size_t n)。memmove函數的功能死拷貝src所指向內存內容前n個字節到dest所指的地址上。 安全

【例子】

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

【分析】

   做爲公用庫函數,請注意安全檢查,注意處理內存區重合的狀況。代碼自己比較簡單。 函數

【代碼】

#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;
}

【結論】

1

做者

   出處:http://www.cnblogs.com/gina spa

   本文版權歸做者全部,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。 3d

相關文章
相關標籤/搜索