连接两个2d char数组

时间:2014-12-07 18:03:08

标签: c arrays 2d concatenation

我写了一个小程序来组合两个2d数组。这是代码:

#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

正如你所看到的,这并非完全错误。这些词之间不应该有空格。

如何修复我的代码?

2 个答案:

答案 0 :(得分:1)

问题在于你在for进行的第二次strcat(final[3], array2[j]);,因为i在那时是3,而在最后的for中,你试图从final[0]final[5],当你只定义final[0]final[3]时(在最后[0]到最后[2]你有名字,最后[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;
}

答案 1 :(得分:0)

您的代码存在一些问题:

  1. 常量MAX对于您的数据来说不够大。字符串"retten?"包含七个字符加一个终止字节。因此,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
    }
    

  4. 关于第1点,我总是建议不要使用任何编译时常量,如MAX。我的经验是,这些只是等待罢工的错误。总有一天,有人会有一个超出限制的用例,你的程序会蓬勃发展。我总是分配缓冲区以适应我需要存储的字符串,将可用的RAM作为我的代码的唯一限制。为此,像strdup()asprintf()这样的功能非常方便,因为他们已经为我做了分配。

    关于第2点,您应该尝试在初始化语句中声明所有循环变量。像这样:

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

    这样你就不会在循环/忘记初始化等之后无意中使用循环变量,因为你的编译器会抱怨未知变量。