C語言哪些常用在面試的庫函數實現過程!C語言專題之拷貝函數實現

c語言基礎 發佈 2020-04-16T03:54:58+00:00

代碼實現char* strcpychar * strcpy // 實現src到dest的複製 if || ) //memTo和memFrom必須有效 return NULL; char *tempTo = memTo; //保存memTo首地址 while

前言


本文主要講解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不保證拷貝的結果的正確。 

代碼實現

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

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

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

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

void *memcpy(void *memTo, const void *memFrom, size_t size)
{
        if ((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效
                return NULL;
        char *tempTo = (char *)memTo;  //保存memTo首地址      
        while (size-- > 0)  //循環size次,複製memFrom的值到memTo中
                *tempTo++ = *((char *)memFrom)++;
        return memTo;
}

測試結果:

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

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

void *memmove(void *dst,const void *src,size_t n)
{
        char *dp = (char *)dst;
        char *sp = (char *)src; 
        if(dst==NULL || src==NULL)return NULL;
        //非重疊 
        //dp < sp 
        //dp > (sp+n)
        if(sp>dp||(sp+n)<dp)
        { 
                while(n--) 
                        *(dp++) = *(sp++);
        }
        else if(sp<dp)//重疊 (此時條件 sp<dp<(sp+n))如果sp==dp則快速的返回
        {//反向拷貝  
                sp += n; 
                dp += n; 
                while(n--)
                        *(--dp) = *(--sp); 
        }
        return dst;
}

測試結果:

尾言

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

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

關鍵字: