編譯環境
本系列文章所提供的算法均在以下環境下編譯通過。
【算法編譯環境】Federa 8,linux 2.6.35.6-45.fc14.i686
【處理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【內存】 2025272 kB
前言
在面試筆試當中,讓面試者自己實現某些庫函數也是數見不鮮。下面要講的一個算法來自百度的面試題。memove函數是C語言里面的一個標准庫,包含在頭文件里。要是先這樣一個算法,需要考慮目標字符串和源字符串邊界重疊的情況。
本系列文章均系筆者所寫,難免有一些錯誤或者紕漏,如果小伙伴們有好的建議或者更好的算法,請不吝賜教。
正文
【題目】
用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; }
【結論】
作者
出處:http://www.cnblogs.com/gina
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。