strcpy,strncpy,memcpy的源碼分析

           首先講講strcpy的源碼,它是三者中最簡單的,但是確實最爲精闢的

char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;
 
        while( *cp++ = *src++ )
                ;              /* Copy src over dst */
 
        return( dst );
}
代碼只有這麼幾行,如果你說你看懂了,其實我是肯定是相信的,但是如果你真的真的看懂了,那說明你對編譯原理的瞭解還真的是有點,爲什麼我這麼說呢,儘管代碼只有這麼幾行,但是可謂是精闢,首先我們來了解一下char*a的構造問題,所有cha*數組都是有自己的起始位置,但是其終結位置是有/0來標記的,想必很多同學都是知道的,如果char a[100]是一個100個char的數組但是真正填寫有意義的字符只有99個,因爲最後一位是/0字符來標記最後一位,告訴你現在是結束位置哦!理解這個是理解三個函數的源碼基礎,再看看上述代碼 while( *cp++ = *src++ );    這個一個空while循環,判斷條件即是功能執行塊(經典之一),這個時候不知道你自己是否有一個疑問,這個執行就不需要任何其他判斷條件嗎?比如src和dst的長度問題,是否可以做到全複製呢?(這是經典之二)
我來細細說下哦,假設char * src比char * dst長度要長,即char * src = aaaaaaaaaa/0 ,char *dst = bbbbb/0 那麼複製之後 dst變爲aaaaaaaaaa/0這可以實現了src複製到dst上。相反如果char * a = aaaaa/0, char * dst = bbbbbbbbbb/0,則複製之後char * dst = aaaaa/0bbb/0(/0也佔一個字符)儘管dst變成這麼長但是其實上,dst=aaaaa/0=a(因爲char數組遇到第一個/0就意味了結束了)所以也是能夠實現複製操作,儘管沒有比較,但是如果犀利的一行代碼就可以做到複製,實在厲害!!(我覺得這行代碼可謂是經典中的經典了,儘管很簡單但是很是精髓,我們慢慢體會啊)接下來的兩段代碼有了這個基礎想必理解就是要輕鬆多了,我明白你們一定可以的。
strncpy的源碼(此函數就是在實現n的賦值,這個肯定會有判斷的,親)

char * __cdecl strncpy ( char * dest, const char * source, size_t count )   
  
{   
    char *start = dest;  
  
    while (count && (*dest++ = *source++)) /* copy string */   
        count--;  
  
    if (count) /* pad out with zeroes */   
        while (--count)   
            *dest++ = '\0';  
  
    return(start);   
}  

memcpy的源碼(這個相當於什麼都可以copy)

void*memcpy(void*dest, constvoid *src, size_tcount)
{
   assert(dest != NULL && src != NULL);
   char*tmp = dest;
   constchar *s = src;
   while(count--)
        *tmp++ = *s++ ;
   returndest;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章