如何从递归函数返回字符串数组?
例如::
char ** jumble( char *jumbStr)//reccurring function
{
char *finalJumble[100];
...code goes here...call jumble again..code goes here
return finalJumble;
}
提前致谢。
答案 0 :(得分:6)
在C中,您无法从函数返回字符串。您只能返回指向字符串的指针。因此,您必须将要返回的字符串作为参数传递给函数(不要使用全局变量或函数局部静态变量),如下所示:
char *func(char *string, size_t stringSize) {
/* Fill the string as wanted */
return string;
}
如果要返回一个字符串数组,这更复杂,尤其是如果数组大小不同的话。最好的恕我直言可能是返回相同字符串中的所有字符串,连接字符串缓冲区中的字符串,并将空字符串作为最后一个字符串的标记。
char *string = "foo\0bar\0foobar\0";
您当前的实现不正确,因为它返回指向本地函数范围中定义的变量的指针。
(如果您真的使用C ++,请返回std::vector<std::string>
。)
答案 1 :(得分:2)
你没有: - )
说真的,你的代码会在每次迭代时创建一个finalJumble数组的副本,你不希望我相信。而正如其他地方所述,finalJumble将超出范围......它有时会起作用,但有时候内存将被回收,应用程序将崩溃。
所以你要在jumble方法之外生成jumble数组:
void jumble_client( char *jumbStr)
char *finalJumble[100];
jumble(finalJuble, jumbStr);
... use finalJumble ...
}
void jumble( char **jumble, char *jumbStr)
{
...code goes here...call jumble again..code goes here
}
当然你使用stl数据类型而不是char数组,你可能想要检查编写一个将finalJumble数据作为成员的混杂类是否合理。但所有这一切都在未来的路上。然而,一旦你解决了原来的问题,试着找出如何做到这一点来了解更多。
答案 2 :(得分:2)
你的实现是不正确的,因为你传递的指针指向一个很快超出范围的局部变量,然后你留下一个空指针并最终崩溃。
如果您仍想继续此方法,则将引用(&amp;)字符数组传递给该函数,并在到达所需的终点后停止递归。完成后,您应该拥有所需的“混乱”字符。
答案 3 :(得分:1)
我会通过引用传递一个字符串向量作为参数。您始终可以使用返回值进行错误检查。
typedef std::vector<std::string> TJumbleVector;
int jumble(char* jumbStr, TJumbleVector& finalJumble) //reccurring function
{
int err = 0;; // error checking
...code goes here...call jumble again..code goes here
// finalJumble.push_back(aGivenString);
return err;
}
如果你想在C中做,你可以跟踪字符串的数量,在最后一次递归调用时做一个malloc,并在每次递归调用后填充数组。您应该记住,调用者应该释放分配的内存。另一种选择是调用者第一次调用以查看他需要多少空间来进行数组,然后执行malloc,以及调用jumble:
char** jumble(char* jumbStr)
{
return recursiveJumble(jumbStr, 0);
}
char** recursiveJumble(char* jumbStr, unsigned int numberOfElements)
{
char** ret = NULL;
if (/*baseCase*/)
{
ret = (char**) malloc(numberOfElements * sizeof(char*));
}
else
{
ret = jumble(/*restOfJumbStr*/, numberOfElements+1);
ret[numberOfElements] = /*aGivenString*/;
}
return ret;
}