![](/img/trans.png)
[英]How do I return a recursive function with an array of ints as argument?
[英]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.