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

问题描述:

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

例如::

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

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

    return finalJumble; 
} 

在此先感谢。

+2

17%? humpf。不是来自Jedi – YuppieNetworking 2010-06-29 12:05:23

+0

@Paul:我认为这是标题。 – 2010-06-29 12:56:01

+0

@Changeling:后来有人明显编辑了问题和标题 - 它最初表示“经常性” – 2010-06-29 15:21:58

在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>

+0

感谢您的回复,Didier。 我真的在做c。不是C++。对不起,错误的标签.. 你可以建议一种不同的方法。 – vj01 2010-06-29 12:08:01

+0

根据需要应用所有三个想法。 – vj01 2010-06-29 12:18:54

+1

如果你想以空字符串结束,这个例子可能应该是'char * string =“foo \ 0bar \ 0foobar \ 0 \ 0”;' – che 2010-06-29 12:24:04

你不:-)

严重的是,你的代码将在每个迭代上创建finalJumble阵列的复制和你不希望我相信。正如其他地方所指出的那样,finalJumble将超出范围......它有时可能会工作,但有时会回收内存并导致应用程序崩溃。

所以,你会产生混乱的方法外混杂阵列:

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的数据类型,你可能要检查它是否会是明智的写一个jumble类,它拥有finalJumble数据作为成员。但所有这一切都在路上。然而,一旦你解决了原来的问题,试着找出如何做到这一点,以了解更多。

+0

谢谢,根据需要应用所有三个想法。感谢所有.. – vj01 2010-06-29 12:21:20

+0

其实我也使用这个建议,它工作得很好。我正在叮当中写信。所以班级的东西不会工作。 – vj01 2010-06-29 23:41:26

+0

是的,最初这篇文章被标记为C++。但我很乐意帮助 – froh42 2010-07-01 12:49:52

你的实现是不正确的,因为你传递了一个指向局部变量的指针,这个局部变量会很快超出范围,然后你留下一个空指针并最终崩溃。

如果您仍希望继续此方法,请通过引用(&)传递该函数的一个字符数组,并在您达到所需的终点时停止递归。一旦你完成,你应该有你需要的'混乱'字符。

+0

谢谢,根据需要应用所有三个想法。谢谢所有.. – vj01 2010-06-29 12:21:40

我会通过引用传递一个字符串矢量作为参数。您始终可以使用返回值进行错误检查。

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; 
} 
+0

谢谢。我正在使用C语言..谢谢..今天学到了很多.. – vj01 2010-06-29 12:20:56

+0

感谢您的帮助 – vj01 2010-06-29 14:14:48