任何人都可以帮助我了解字符串撤消的工作原理吗?
#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中的最终值是什么?
答案 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)