使用递归反转字符串

时间:2012-08-07 15:36:34

标签: c string function reverse

我从互联网上获取此代码,但我无法获得整个代码。 例如if(*str)。这段代码是什么意思?并且还可以返回一个字符串?我认为main中的数组可以改变 直接在一个函数中,但在这里它被返回..

#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 个答案:

答案 0 :(得分:1)

由于使用了静态变量,这不是最明显的递归示例。希望代码通常对你来说很清楚,我怀疑那些令你困惑的部分与我一开始感到困惑的一样。

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

一行一行。

if(*str){

如果我们还没有到达null终止符。

     getReverse(str+1);

在字符串的下一个字符上调用getReverse函数。到目前为止看起来非常简单。但它似乎也可能实际上没有反转任何东西,因为这是下一行

     rev[i++] = *str;

我们在str的开头分配索引i并增加i,但这里是棘手的部分。 i可能不是您的想法。在i递增之前调用getReverse。 i是静态的,因此在函数调用之间会保持更改。所以,假设我们有一个5个字母的单词,让我们说“马”,我们最终会在堆栈上调用6个getReverse。第6个不会做任何事情,因为那是它找到空终止符的地方。诀窍是我们将以相反的顺序解决调用问题。首先,str指向'e'的调用将解析并递增i,因为所有其他的仍然在等待他们对getReverse的调用返回。所以最后的字母实际上是第一个被添加并增加i的字母,这可能会让人感到困惑。