如何从递归函数返回字符串数组?
如何从递归函数返回字符串数组?如何从递归函数返回字符串数组?
例如::
char ** jumble(char *jumbStr)//reccurring function
{
char *finalJumble[100];
...code goes here...call jumble again..code goes here
return finalJumble;
}
在此先感谢。
在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>
)
你不:-)
严重的是,你的代码将在每个迭代上创建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数据作为成员。但所有这一切都在路上。然而,一旦你解决了原来的问题,试着找出如何做到这一点,以了解更多。
你的实现是不正确的,因为你传递了一个指向局部变量的指针,这个局部变量会很快超出范围,然后你留下一个空指针并最终崩溃。
如果您仍希望继续此方法,请通过引用(&)传递该函数的一个字符数组,并在您达到所需的终点时停止递归。一旦你完成,你应该有你需要的'混乱'字符。
谢谢,根据需要应用所有三个想法。谢谢所有.. – 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;
}
17%? humpf。不是来自Jedi – YuppieNetworking 2010-06-29 12:05:23
@Paul:我认为这是标题。 – 2010-06-29 12:56:01
@Changeling:后来有人明显编辑了问题和标题 - 它最初表示“经常性” – 2010-06-29 15:21:58