我从互联网上获取此代码,但我无法获得整个代码。
例如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;
}
答案 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
的字母,这可能会让人感到困惑。