C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

前言


C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

本文主要講解C語言的常用的一些函數的自我實現,經常出現在編程筆試題中,實現過程簡單,對於學習C語言的同學來說也是很有幫助的。主要有以下三個函數:

  1. strcpy:char * strcpy(char * dest, const char * src);
  2. memcpy:void *memcpy(void *memTo, const void *memFrom, size_t size);
  3. memmove:void *memmove(void *dst,const void *src,size_t n);

函數介紹

可能大家都知道這三個函數都可以實現拷貝效果,在這裡主要是講下他們之間的區別,strcpy 和 memcpy主要有以下三方面的區別:      

  1. 複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符串、整型、結構體、類等。      
  2. 複製的方法不同。strcpy不需要指定長度,它遇到被複制字符串的結束符"\\0”才結束,所以容易溢出。memcpy則是根據第3個參數決定複製的長度。      
  3. 用途不同。通常在複製字符串時用strcpy,而需要複製其它類型的數據是用memcpy

memcpy和memmove區別

當內存發生局部重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。 

C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

代碼實現

char * strcpy(char * dest, constchar * src)

<code>char * strcpy(char * dest, const char * src) // 實現src到dest的複製
{
\tif ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性
\t{
\t\treturn NULL;
\t}
\tchar *strdest = dest; //保存目標字符串的首地址
\twhile ((*dest++ = *src++) != '\\0'); //把src字符串的內容複製到dest下
\treturn strdest;
}/<code>

測試結果:(不考慮secondStr長度大於firstStr的問題!)

C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

void *memcpy(void *memTo, const void *memFrom, size_t size)

<code>void *memcpy(void *memTo, const void *memFrom, size_t size)
{
\tif ((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效
\t\treturn NULL;
\tchar *tempTo = (char *)memTo; //保存memTo首地址
\twhile (size-- > 0) //循環size次,複製memFrom的值到memTo中
\t\t*tempTo++ = *((char *)memFrom)++;
\treturn memTo;
}/<code>

測試結果:

C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

順帶一提,自定義類型的數據即可:

C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

void *memmove(void *dst,const void *src,size_t n)

<code>void *memmove(void *dst,const void *src,size_t n)
{
\tchar *dp = (char *)dst;
\tchar *sp = (char *)src;
\tif(dst==NULL || class="lazy" data-original==NULL)return NULL;
\t//非重疊
\t//dp < sp

\t//dp > (sp+n)
\tif(sp>dp||(sp+n)\t{
\t\twhile(n--)
\t\t\t*(dp++) = *(sp++);
\t}
\telse if(sp\t{//反向拷貝
\t\tsp += n;
\t\tdp += n;
\t\twhile(n--)
\t\t\t*(--dp) = *(--sp);
\t}
\treturn dst;
}
/<code>

測試結果:

C語言專題之三大拷貝庫函數的實現,測試成功,源碼奉上供你學習

尾言

文章都是手打原創,每天最淺顯的介紹C語言、C++,windows知識,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。如果足下基礎比較差,不妨關注下人人都可以學習的視頻教程

通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢


分享到:


相關文章: