2014-12-07 61 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]); 
} 

这样,你不跑不小心使用了循环变量在循环后/忘了初始化等,因为你的编译器会抱怨未知变量的危险。