使用递归在C中反转字符串

时间:2017-03-02 08:06:02

标签: c string recursion reverse

任何人都可以帮助我了解字符串撤消的工作原理吗?

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

在这段代码中,反向函数能够一次输入一个字符,对吗?如果它不是&#39; \ n&#39;它再次调用反向功能。所以下次第二个字符出现时,第二个字符将在变量c中,对吧?

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

2 个答案:

答案 0 :(得分:6)

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

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

reverse()返回main()后,c的最终值将为 no ,因为包含它的堆栈框架已被销毁。

答案 1 :(得分:2)

在这个程序中输入一个字符串(一个字符块,比如&#34; hello&#34;),每次调用函数reverse()时每个单个字符并更新堆栈(push),除非它没有得到Null。因此,尽管将以递归方式调用函数,它将更新堆栈并下推最后输入的字符数据。最后,当它获得Null时,它将开始以LIFO(后进先出)顺序从堆栈中获取数据。因此,最后输入的字符将首先被取出,最后一个将是第二个。这将在第一个字符输入之前发生。 检查维基百科右上角的图像,了解Stack的操作。 https://en.wikipedia.org/wiki/Stack_(abstract_data_type)