使用递归反转字符串

我从互联网上得到这个代码,但我无法得到整个代码。 例如if(*str) 。 这段代码是什么意思? 还可以返回一个字符串吗? 我认为main中的数组可以直接在函数中更改,但这里已经返回了..

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

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

 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 ,这可能是令人困惑的。