【问题标题】:How do I return an array of strings from a recursive function?如何从递归函数返回字符串数组?
【发布时间】:2010-06-29 12:01:50
【问题描述】:

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

例如::

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

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

   return finalJumble;
} 

提前致谢。

【问题讨论】:

  • @Paul:从标题上我是这么认为的。
  • @Changeling:显然有人随后编辑了问题和标题 - 它最初说的是“重复”

标签: c arrays string


【解决方案1】:

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

【讨论】:

  • 感谢您的回复,Didier。我实际上是在c中做的。不是 C++。抱歉打错了标签。你能建议一种不同的方法吗?
  • 如果你想用空字符串结束,例子应该是char *string = "foo\0bar\0foobar\0\0";
  • @che:编译器已经添加了最后一个'\0'。无需添加!
【解决方案2】:

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

如果您仍想继续这种方法,则通过引用 (&) 将一个字符数组传递给该函数,并在到达所需的终点后停止递归。完成后,您应该拥有所需的“杂乱”字符。

【讨论】:

    【解决方案3】:

    你没有:-)

    说真的,您的代码会在每次迭代时创建 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 数据作为成员的 jumble 类是否合理。但所有这一切都在路上。不过,一旦您解决了最初的问题,请尝试了解如何做到这一点以了解更多信息。

    【讨论】:

    • 其实我也用过这个建议,效果很好。我正在用 clang 写作。所以类的东西不会起作用..
    • 是的,这篇文章最初被标记为 C++。但我很乐意提供帮助
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2015-02-10
      • 2019-04-25
      • 2011-06-05
      相关资源
      最近更新 更多