2012-08-07 99 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,在这里可能会引起混淆。