我写了一个小程序来组合两个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
正如你所看到的,这并非完全错误。这些词之间不应该有空格。
如何修复我的代码?
答案 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)
您的代码存在一些问题:
常量MAX
对于您的数据来说不够大。字符串"retten?"
包含七个字符加一个终止字节。因此,MAX
必须至少为8
,否则您将获得未定义的行为。
您的第二个循环包含使用错误的索引final[i]
。有关更正的版本,请参见第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
}
关于第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]);
}
这样你就不会在循环/忘记初始化等之后无意中使用循环变量,因为你的编译器会抱怨未知变量。