如何从递归函数返回字符串数组?

时间:2010-06-29 12:01:50

标签: c arrays string

如何从递归函数返回字符串数组?

例如::

char ** jumble( char *jumbStr)//reccurring function
{
   char *finalJumble[100];

   ...code goes here...call jumble again..code goes here

   return finalJumble;
} 

提前致谢。

4 个答案:

答案 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;
}