2017-03-02 47 views
1

任何人都可以帮助我理解这个字符串反转的工作原理吗?使用递归在C中反转字符串

#include <stdio.h> 
void reverse(); 

int main() 
{ 
    printf("Enter a sentence: "); 
    reverse(); 

    return 0; 
} 

void reverse() 
{ 
    char c; 
    scanf("%c", &c); 

    if(c != '\n') 
    { 
     reverse(); 
     printf("%c",c); 
    } 
} 

在此代码中,函数reverse能够一次获取输入句子一个字符,对吗?如果它不是'\ n',它会再次调用反向函数。所以下一次当第二个字符被拍摄时,第二个字符将会在变量c中,对吗?

如果是这样,该代码如何能够反转给定的任何字符串? c中的最终值是什么?

+6

该函数不会反转字符串,它只是通过在print语句前仔细放置递归调用来反向标准输入。 – StoryTeller

+0

现在,该学习如何使用调试器,该调试器可让您逐步完成代码并允许您检查变量。但是一张纸和一支铅笔应该足以弄清楚这是如何工作的。 –

+0

我发誓他们是一个关于每天在本网站上反转字符串的问题。 – RoadRunner

回答

6

理解这个的关键是char c变量是本地的函数。这意味着每次输入函数时都会将其分配到堆栈中。在第二次和后续调用新的变量的实例在堆栈上创建。这些是独一无二的,不会互相干扰。

当终止字符\n最终被看到时,该函数在被调用后返回到该行并且该栈被恢复到它在函数被调用之前的状态。这意味着变量char c将被恢复到之前的值。因此堆栈被打开,字符按照与输入相反的顺序被打印。

一旦reverse()返回main()会有c没有终值,因为它所含的堆栈帧将被销毁。

+0

非常感谢@mhawke对此进行解释。 –

2

在这个程序中,每当一个字符串(一个字符块,例如“hello”)被输入时,每次调用函数reverse()并更新堆栈(push),除非它不得到空。因此,函数将以递归方式调用,它将更新堆栈并按下最后输入的字符数据。最后,当它变为Null时,它将开始以LIFO(后进先出)顺序从堆栈中获取数据。所以,最后输入的字符将被首先取出,倒数第二个将被取出。这将发生,直到输入第一个字符。 查看wikipedia右侧的图片以了解Stack的操作。 https://en.wikipedia.org/wiki/Stack_(abstract_data_type)

+0

非常感谢@utpal Shankar向我解释这个概念。 –