2012-08-07 146 views
0

我從互聯網上得到了這段代碼,但我無法得到整個代碼。例如 if(*str)。這個代碼是什麼意思?還可以返回一個字符串?我認爲,在主陣列可以在一個函數直接改變 但在這裏,它被送回..反向使用遞歸的字符串

#include<stdio.h> 
#define MAX 100 
char* getReverse(char[]); 

int main(){ 

    char str[MAX],*rev; 

    printf("Enter any string: "); 
    scanf("%s",str); 

    rev = getReverse(str); 

    printf("Reversed string is: %s\n\n",rev); 
    return 0; 
}  

char* getReverse(char str[]){ 

    static int i=0; 
    static char rev[MAX]; 

    if(*str){ 
     getReverse(str+1); 
     rev[i++] = *str; 
    } 

    return rev; 
} 

回答

1

這不是遞歸的最明顯的例子,由於使用靜態變量。希望代碼一般對你來說似乎很清楚,我懷疑那些令你感到困惑的部分與我一開始就感到困惑的部分是一樣的。

if(*str){ 
    getReverse(str+1); 
    rev[i++] = *str; 
} 

所以一行一行。

if(*str){ 

如果我們還沒有到達空終止符。

 getReverse(str+1); 

在字符串的下一個字符上調用getReverse函數。這看起來很直接。但是,它也好像它實際上可能沒有任何扭轉,因爲這是下一行

 rev[i++] = *str; 

我們在海峽開始分配指標i字符,並增加i,但這裏是棘手的部分。 i可能不是你的想法。 getReverse在i遞增之前被調用。而i是靜態的,所以更改將在函數調用之間持續存在。所以,假設我們有一個5個字母的單詞,讓我們說「馬」,我們最終將有6個電話到達getReverse。第六不會做任何事情,因爲那是它找到空終止符的地方。訣竅是,我們將接着以相反的順序解決電話問題。首先,str指向'e'的呼叫將解析並遞增i,因爲所有其他呼叫仍在等待他們對getReverse的呼叫返回。所以最後的字母實際上是第一個被添加和增加的字符i,在這裏可能會引起混淆。