2016-04-13 55 views
0

因此,這是在C標準字符串連接代碼:字符串連接使用指針

char *stringcat(char *dest, const char *src){ 
    char *save=dest; 
    while(*save !='\0'){ 
     save++; 
    } 
    while(*src!='\0'){ 
     *save=*src; 
     save++; 
     src++; 
    } 
    *save='\0'; 
    return dest; 
} 

我的問題是,爲什麼當我們更換第一while循環有以下:

while(*save++){}; 

它但是,當替換爲:

while(*++save){}; 

它確實有效。在前兩個實例中,將結束點保存到位於末尾的空終止符處,然後由src中的第一個字符覆蓋。但是,在第三種情況下,似乎保存將指向之後的字符,這是奇怪的。

+1

您認爲它們應該如何/爲什麼相同? –

+0

嗯,試試'char buf [10] =「123」; stringcat(buf,&buf [1]); puts(buf);' – chux

回答

0

如果你使它成爲while (*save++) {},你要重複的操作是:加載字節,增量指針,檢查字節是否爲零。因此,在字符串末尾會發生什麼:加載空字節,增量指針,檢查字節是否爲零,看到它是退出循環。所以save將指向空字節之後。但是你想要開始複製該空字節的頂部的第二個字符串,而不是在它之後。 ?

(有沒有可能是你的++savesave++在你的腦袋互換的含義如果是這樣,這裏有一個有用的記憶:++save意味着增量,然後加載值; save++手段裝載值,然後增加所以。其中變量名稱和++顯示的順序對應於操作順序。)

+0

是的,我想我有兩個開關的想法。當我運行 'char a [10] =「hello」; char b [10] =「再見」; stringcat(A,B);放入(a);' 然後,一個將包含:''hello \ 0goodbye「',它會通過put打印出」hello「,對吧?另一方面,通過使用++保存我保證保存將在最後指向空終止符,以覆蓋它? –

+0

沒錯。不過,我想指出另一件事。 ''hello \ 0goodbye \ 0「'(不要忘記最後的空字符!)是14個字符,所以現在你已經寫過數組'a'的末尾,並且可能發生各種不好的事情。這被稱爲「緩衝區溢出」,這是一種非常常見的錯誤,每當你在C中使用數組和指針時,應該記住它並確保它不會發生。這是一個真正的痛苦,很容易出錯。 –

0
while(*save++) 

先取消保存並將該值與0進行比較,然後遞增保存。

while(*save !='\0'){ 
    save++; 
} 

先取消保存,與0相比只有非零時遞增。 看到區別?