【发布时间】:2018-09-28 20:27:57
【问题描述】:
我试图创建一个函数来返回 char *tab[] 以填充 char *tab1[]
#include <stdio.h>
#include <string.h>
char * fill(){
char *tab[2];
tab[0] = "text 1";
tab[1] = "text 2";
return tab;
}
int main(){
char *tab1[2];
tab1 = fill();
return 0;
}
我尝试使用strcpy,strncpy,返回一个char **,malloc。我每次只能复制一个索引,比如tab1[0] = tab[0],但是我需要一次性返回完整的数组。
我正在使用递归函数来填充 *tab[],为此我需要连接一些字符串和 var:
void fill(int n, char *x, char *y, char *z, char *tab[]){
int i;
char text[40];
if(n == 1){
strcpy(text, "text 1 ");
strcat(text, x);
strcat(text, " text 2 ");
strcat(text, y);
tab[0] = text;
} else if(tab[n-1] == ""){
strcpy(text, "text 1 ");
strcat(text, x);
strcat(text, " text 2 ");
strcat(text, z);
strcat(text, "\ntext 1 ");
strcat(text, z);
strcat(text, " text 2 ");
strcat(text, y);
tab[n-1] = text;
if(n-1 > 1){
fill(n-1, x, z, y, tab);
}
}
}
最后我需要返回 tab[] 以填充主目录中的另一个选项卡:
int main(){
int n = 2;
char *tab1[n];
fill(n, "a", "b", "c", tab1);
return 0;
}
【问题讨论】:
-
tab[0] = text;将本地text分配给tab[0]。这仅在函数结束之前有效,之后char text[40];不再有效。调用代码不能使用tab[0]而不引起未定义的行为 (UB)。调用代码需要为连接的字符串提供内存,或者函数可以分配数据。你想要什么? -
您真的需要像第一个示例中那样返回一个数组,还是像第二个示例中那样填充调用者提供的数组?它们有点不同。
-
我看到您尝试编写递归解决方案。这不是最好的方法。是否需要递归?如果是这样,为什么会有这个要求?