簡體   English   中英

如何從遞歸函數返回字符串數組?

[英]How do I return an array of strings from a recursive function?

如何從遞歸函數返回字符串數組?

例如::

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

如果要返回字符串數組,則更復雜,尤其是當數組的大小變化時。 最好的IMHO可能是返回同一字符串中的所有字符串,將字符串緩沖區中的字符串連接起來,並使用空字符串作為最后一個字符串的標記。

char *string = "foo\0bar\0foobar\0";

您當前的實現不正確,因為它返回指向在局部函數范圍內定義的變量的指針。

(如果您確實使用C ++,則返回一個std::vector<std::string> 。)

你不:-)

認真地講,您的代碼將在每次迭代中創建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類是否明智。 但是,所有這些都還遙不可及。 不過,一旦您解決了原始問題,就嘗試找出如何做的步驟以了解更多信息。

您的實現是不正確的,因為您正在傳遞指向局部變量的指針,該指針將很快超出范圍,然后留下空指針,最終導致崩潰。

如果您仍然想繼續使用此方法,請通過引用(&)將一個字符數組傳遞給該函數,並在達到所需的終點時停止遞歸。 完成后,您應該擁有所需的“混亂”字符。

我將通過引用將字符串向量作為參數傳遞。 您始終可以使用返回值進行錯誤檢查。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM