實現C中的strcpy函式

bian_qing_quan11發表於2017-07-31

1、strcpy庫函式介紹

C語言中在標頭檔案<string.h>中,C++中在<cstring>中;

函式原型:char * strcpy(char * destStr, char srcStr);

函式功能:將srcStr中的字串拷貝到destStr的記憶體中;通過字串結束符'\0'來控制結束,如果destStr預留的記憶體不夠的話會“溢位”。


2、實現strcpy函式

這個也是一個經常出的面試題,如果面試者只是根據功能寫出如下的程式碼

char * my_strcpy(char *dest, char * src)
{
     if(dest == NULL || src == NULL)
            return NULL;
     char *p_dest = dest;
     char *p_src = src;
     while(*p_src != '\0')
     {
          *p_dest = *p_src;
          ++p_dest;
          ++p_src;
     }
     *p_dest = '\0';
     return dest;
}
這樣一個實現看似是正確的:1)考慮了空指標;

                                            2)返回課目的地址;

                                            3)目的串末尾為'\0';

但是它並沒有考慮“記憶體重疊”問題。這個題目的考察點和memcpy是一樣的,都在考察“記憶體重疊”,如果面試官先問你memcpy的程式碼,然後再問你這個你可能會意識到這個問題。但是如果面試官直接問你strcpy的實現,可能你就蒙了。


對strcpy的改進:

void * my_memcpy(void *dst,const void *src,unsigned int count)  
{  
     assert(dst);  
     assert(src);  
     void * ret = dst;  
     if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重疊,低位元組向高位元組拷貝  
     {  
         while(count--)  
         {  
             *(char *)dst = *(char *)src;  
             dst = (char *)dst + 1;  
             src = (char *)src + 1;  
         }  
     }  
     else                       //源地址和目的地址重疊,高位元組向低位元組拷貝  
     {   
         dst = (char *)dst + count - 1;  
         src = (char *)src + count - 1;   
         while(count--)   
         {  
             *(char *)dst = *(char *)src;  
             dst = (char *)dst - 1;  
             src = (char *)src - 1;  
         }  
    }  
    return ret;  
}  


char *my_strcpy(char *dst,const char *src)  
{  
    assert(dst != NULL);  
    assert(src != NULL);  
    char *ret = dst;  
    my_memcpy(dst,src,strlen(src)+1);  
    return ret;  
}  
這樣就可以有效地處理“記憶體重疊”問題。

相關文章