2014-01-30 41 views
0
#include <stdio.h> 
#include <string.h> 
int main(int argc, char* argv[]) 
{ 
    char *a = "abcde"; 
    char *b = "vwxyz"; 
    char s[10]; 

    strcpy(s,a+3); 
    printf("%s\n",s); 

    strcpy(s+2,b); 
    printf("%s\n",s); 
    return 0; 
} 

我有一個小問題,找出爲什麼第二個strcpy(s + 2,b)輸出devwxyz。Strcpy在C輸出

我瞭解第一部分,因爲它指向[3]並從此計算到僅爲'de'的空字符。

輸出是:

devwxyz

基本上,我不知道如何找到「S + 2」,我不知道爲什麼它是「德」在最終輸出的開始。 'devwxyz'

希望有人能幫助,謝謝你們。

編輯:

我試圖用這一段代碼來弄明白,似乎索引並沒有爲我工作..

#include <stdio.h> 
#include <string.h> 
int main(int argc, char* argv[]) 
{ 
    char *a = "abcde"; 
    char *b = "vwxyz"; 
    char s[10]; 

    strcpy(s,a+0); 
    printf("%s\n",s); 

    strcpy(s+1,b); 
    printf("%s\n",s); 
    return 0; 
} 

希望有人能解釋,這是因爲第一的strcpy結果abcde。和s [1]這將取決於字母'b',所以它不是abvwxyz?但正確的結果是avwxyz。

+0

閱讀指針算術。 's',在衰減到指針後,指向數組的元素'0'。 's + 2'指向數組的元素'2'。 –

+0

's + 2'指向's [2]'。 – BLUEPIXY

+0

*我不知道如何找到「s + 2」* - 你是說你不知道如何數到2? *我不確定爲什麼它在最終輸出開始時是'de'。* - 爲什麼不是?您將「de」複製到s中,並且以後不會更改它。 *希望有人可以幫助,謝謝你們。* - 很難弄清楚你不明白哪個明顯的事情。 –

回答

3

您的代碼有兩個電話strcpy()。正如你所描述的,第一個副本「德」。

第二個將「vwxyz」複製到ss + 2)中的第三個字符的地址。由於s只有兩個字符長,因此它有效地將「vwxyz」附加到「de」。

+0

完美的解釋!我可以看到現在的工作方式!非常感謝好友! – user3039950

0

您發現s + 2的方式與您找到+3相同。在這種情況下,s的第三個字符是在第一次複製的\ 0(並被此strcpy取代)。