2014-12-07 62 views
1

我寫了一個小程序來組合兩個2d數組。下面是代碼:連接兩個2d char數組

#define MAX 7 

int main(void) { 
    int i, j; 
    char *array1[] = {"Welt,", "bist", "du"}; 
    char *array2[] = {"noch", "zu", "retten?"}; 

    char final[MAX][MAX]; 
    for(i = 0; i < 3; i++) { 
    // initialize ith names element with first name 
    strcpy(final[i], array1[i]); 
    } 

    for(j = 0; j < 3; j++) { 
    // concatenate the last name to the firstname+space string 
    strcat(final[i], array2[j]); 
    } 

    for (i = 0; i != 6; i++) { 
    printf("%s", final[i]); 
    } 
    return EXIT_SUCCESS; 
} 

我得到這樣真的很奇怪輸出:

世界報,bistbistdunochzuretten uretten恩???

而我想是這樣的:

世界報,bistdunochzuretten

正如你可以看到它是不是完全錯誤的。詞語之間不應有空格。

我該如何修復我的代碼?

回答

1

的問題是,在第二for你在做strcat(final[3], array2[j]);,因爲i爲3在這一點上,並在最後for您試圖打印從final[0]final[5],當你只有定義final[0]final[3](其中上final [0]到final [2]你有名字,在final [3]中所有的姓氏連接在一起,這也超過了字符的限制),並且沒有用新行打印它們,很難分辨哪個字符串是什麼。

試試這個。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAX 7 

int main(void) { 
    int i,j; 
    char *array1[] = {"Welt","bist","du"};  
    char *array2[] = {"noch","zu","retten?"}; 

    char final[MAX][MAX]; 

    for(i=0;i<3;i++)  
     strcpy(final[i], array1[i]); //To initialize ith names element with first name 

    for(j=0;j<3;j++) 
     strcat(final[j],array2[j]); //Concatanate the last name to the firstname+ space string 

    for (i = 0; i < 3; i++) 
     printf("%s\n", final[i]); 

    return EXIT_SUCCESS; 
} 
+0

sry不,不起作用,或者我無法處理它。 – WirJun 2014-12-07 18:32:27

+0

對不起,我沒有說過,但現在嘗試包括我在代碼中的庫。 – OiciTrap 2014-12-07 18:38:07

+0

很高興我能幫助你。 – OiciTrap 2014-12-07 18:50:06

0

有幾個問題與您的代碼:

  1. 恆定MAX不是你的數據足夠大。字符串"retten?"包含7個字符加上一個終止字節。因此,MAX必須至少爲8,否則您會得到未定義的行爲。

  2. 你的第二個循環包含在final[i]中使用了錯誤的索引。見修正版本的第3點。

  3. 使用strcat()是錯誤的,您應該使用strcpy(),就像在第一個循環中一樣。再加上點2,你的第二個環要麼是這樣的:

    for(j = 0; j < 3; i++, j++) { //add increment for i 
        strcpy(final[i], array2[j]); 
    } 
    

    或像這樣:

    for(j = 0; j < 3; j++) { 
        strcpy(final[3 + j], array2[j]); //derive the index from j 
    } 
    

關於第一點,我一直建議不要使用任何編譯時間常量,如MAX。我的經驗是,這些只是等待罷工的錯誤。有一天,有人會有一個超出限制的用例,並且你的程序開始繁榮。我總是分配緩衝區來適應我需要存儲的字符串,並將可用的RAM作爲我的代碼的唯一限制。爲此,strdup()asprintf()等功能非常方便,因爲它們已經爲我執行了分配。

關於第2點,您應該嘗試在初始化語句中聲明所有循環變量。像這樣:

for(int i = 0; i < 3; i++) { 
    // initialize ith names element with first name 
    strcpy(final[i], array1[i]); 
} 

這樣,你不跑不小心使用了循環變量在循環後/忘了初始化等,因爲你的編譯器會抱怨未知變量的危險。