首先講講strcpy的源碼,它是三者中最簡單的,但是確實最爲精闢的
{
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 *start = dest;
while (count && (*dest++ = *source++)) /* copy string */
count--;
if (count) /* pad out with zeroes */
while (--count)
*dest++ = '\0';
return(start);
}
void*memcpy(void*dest, constvoid *src, size_tcount)
{
assert(dest != NULL && src != NULL);
char*tmp = dest;
constchar *s = src;
while(count--)
*tmp++ = *s++ ;
returndest;
}