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

使用递归反转C中的字符串,c,string,recursion,reverse,C,String,Recursion,Reverse,有人能帮我理解这个字符串反转是如何工作的吗 在这段代码中,函数reverse能够一次获得一个字符的输入句子,对吗?如果不是“\n”,则再次调用reverse函数。所以下一次当第二个字符被取时,第二个字符将在变量c中,对吗 如果是这样,这段代码如何能够反转给定的任何字符串? c中的最终值是什么?理解这一点的关键是char c变量是函数的局部变量。这意味着每次输入函数时都会在堆栈上分配它。在第二次和后续调用中,将在堆栈上创建变量的新实例。这些是独一无二的,不会相互干扰 当最终看到终止字符\n时,函数

有人能帮我理解这个字符串反转是如何工作的吗

在这段代码中,函数reverse能够一次获得一个字符的输入句子,对吗?如果不是“\n”,则再次调用reverse函数。所以下一次当第二个字符被取时,第二个字符将在变量c中,对吗

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

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

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


一旦reverse返回main,c将没有最终值,因为包含它的堆栈帧将被破坏。

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

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


一旦reverse返回到main,c将没有最终值,因为包含它的堆栈帧将被破坏。

在该程序中,当输入字符串时,每次调用函数reverse时,为每个字符输入一个字符块,说hello,并更新stackpush,除非它不为Null。因此,函数将以递归方式调用,它将更新堆栈并向下推最后输入的字符数据。最后,当它为Null时,它将开始以先出后进的顺序从LIFOLast中的堆栈中提取数据。因此,最后输入的字符将首先取出,最后一个字符将是第二个字符。在输入第一个字符之前,将一直执行此操作。 查看维基百科右角的图片,了解堆栈的操作。

在该程序中,每当调用函数reverse时,输入一个字符块,对每个字符说hello,并更新stackpush,除非它不为Null。因此,函数将以递归方式调用,它将更新堆栈并向下推最后输入的字符数据。最后,当它为Null时,它将开始以先出后进的顺序从LIFOLast中的堆栈中提取数据。因此,最后输入的字符将首先取出,最后一个字符将是第二个字符。在输入第一个字符之前,将一直执行此操作。 查看维基百科右角的图片,了解堆栈的操作。

此函数不反转字符串,它只是通过小心地将递归调用放在print语句之前,以反转方式回显标准输入。现在,是时候学习如何使用调试器了,调试器允许您逐步完成代码并允许您检查变量。但一张纸和一支铅笔就足以说明这是怎么回事了。我发誓,这是一个关于在这个网站上每天反转字符串的问题。@RoadRunner-有点像在每次面试中都有一个关于排序数组的问题:这个函数不反转字符串,它只是通过小心地将递归调用放在print语句之前,以相反的方式响应标准输入。现在,是学习如何使用调试器的时候了,调试器允许您单步执行代码并允许您检查变量。但是一张纸和一支铅笔就足以说明这是怎么回事了。我发誓这是一个关于在这个网站上每天反转字符串的问题。@RoadRunner-有点像在每次面试中都有一个关于排序数组的问题:非常感谢@mhawke解释这个问题。非常感谢@mhawke解释这个问题。非常感谢@utpal Shankar非常感谢@utpal Shankar向我解释这个概念。
#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);
    }
}