2012-07-15 116 views
1

以下代碼僅連接第一個字符串並忽略第二個..從我收集的內容來看,它與Null終止的字符串有關。由於我是C新手,這對我來說是一個新概念。有人可以幫助下面的代碼工作?這對我的理解會有很大的幫助。C:字符串Concatenation:空終止字符串

void concatTest(); 

int main() 
{ 
    concatTest(); 

    system("PAUSE"); 
    return 0; 
} 

void concatTest() 
{ 
    char string1[20], string2[20], string3[40]; 
    char *ptr1, *ptr2, *ptr3; 
    ptr1 = &string1[0]; 
    ptr2 = &string2[0]; 
    ptr3 = &string3[0]; 
    int i; 

    printf("You need to enter 2 strings.. each of which is no more than 20 chars in length: \n"); 

    printf("Enter string #1: \n"); 
    scanf("%s", string1); 

    printf("Enter string #2: \n"); 
    scanf("%s", string2); 

    int len1 = strlen(string1); 
    int len2 = strlen(string2); 

    for (i = 0; i < len1; i++) 
    { 
     ptr3[i] = ptr1[i]; 
    } 
    for (i = len1; i < len1 + len2; i++) 
    { 
     ptr3[i] = ptr2[i]; 
    } 

    printf("%s\n", string3); 
} 

回答

2

您正在使用iptr2[i]建立索引,範圍從len1len1 + len2。該值可能會超出string2數組的範圍(除非您鍵入的第一個字符串恰好爲空)。

如下我可以寫你的第二個循環:

for (i = 0; i < len2; i++) { 
    ptr3[len1 + i] = ptr2[i]; 
} 
+0

非常好。謝謝格雷格..我會接受你的答案,只要StackOverflow讓我(約7分鐘).. – Matt 2012-07-16 00:02:22

+0

我有點喜歡索引開始在ptr3點像原始代碼 - 認爲它更清晰。只需要從正確的位置複製。 – Hogan 2012-07-16 00:58:59

2

我的答案沒有代碼,但希望有一個有用的解釋。

C中的每個字符串以\0結尾。

如果你想連接兩個字符串,你需要確保你覆蓋第一個字符串(\0)與第二串的第一字符的最後一個字符。否則,無論「連接」字符串有多長時間,只要字符串函數遇到\0,就會假定字符串的末尾已到達。

當然,你需要確保你有足夠的分配空間的聯合字符串。

+0

我猜,謝謝。但是,我需要的是一個代碼示例..如何真正做到這一點?我可能會踢我自己,當我得到答案..但現在我只是不能看到它 – Matt 2012-07-15 23:57:46

+1

再次感謝。不是我一直在尋找的答案,但是無論如何你都會得到贊成票;-) – Matt 2012-07-16 00:03:07

1

你必須要在PTR2的第一個字符開始。

ptr3[i] = ptr2[i-len1]; 

從我收集,它是與空結束 字符串。

是的。字符串從零開始。您從基於第一個字符串長度的某個隨機點開始。