在C语言中使用递归反转字符串的方法对我来说很奇怪
在我的大学笔记中,我发现了下面的代码来反转C中的字符串。我不明白这个例子中的递归是如何工作的,因为我觉得它很神奇!更具体地说,如果我键入单词“one”,程序将打印出单词“eno”。根据解释,该函数递归地从用户读取字符,直到用户按Enter('\n'),然后打印出相反的单词。但是,如果函数最后一次递归调用自己是在用户按下Enter键之后,程序无法再次进入函数以调用printf,那么如何打印单词呢?它是否使用了某种缓冲区以及它是如何工作的??以下是C源代码:在C语言中使用递归反转字符串的方法对我来说很奇怪,c,recursion,character,printf,scanf,C,Recursion,Character,Printf,Scanf,在我的大学笔记中,我发现了下面的代码来反转C中的字符串。我不明白这个例子中的递归是如何工作的,因为我觉得它很神奇!更具体地说,如果我键入单词“one”,程序将打印出单词“eno”。根据解释,该函数递归地从用户读取字符,直到用户按Enter('\n'),然后打印出相反的单词。但是,如果函数最后一次递归调用自己是在用户按下Enter键之后,程序无法再次进入函数以调用printf,那么如何打印单词呢?它是否使用了某种缓冲区以及它是如何工作的??以下是C源代码: #include <stdio.h
#include <stdio.h>
void readCharsAndReverse(void);
int main (void)
{
printf ("Give characters to reverse:");
readCharsAndReverse();
printf ("\n\n");
system("PAUSE");
}
void readCharsAndReverse(void)
{
char ch;
scanf ("%c", &ch);
if (ch != '\n')
readCharsAndReverse();
printf ("%c", ch);
}
#包括
无效读取字符和反转(无效);
内部主(空)
{
printf(“给字符反转:”);
readCharsAndReverse();
printf(“\n\n”);
系统(“暂停”);
}
void readchars和reverse(void)
{
char ch;
scanf(“%c”和“ch”);
如果(ch!='\n')
readCharsAndReverse();
printf(“%c”,ch);
}
readCharsAndReverse在满足“\n”之前不会停止,因此在“一”的情况下:
扫描“o”。它不是一个字符,所以它继续到下一个字符,即“n”,在“e”之后我们得到“\n”。现在我们转到下一行(因为我们谈到了基本情况,所以下一行告诉我们打印堆栈中的内容(第一行是“eno”)、第二行是“n”,最后是“o”)
在任何时候编写堆栈时,我都会进行更多的重新编译并查看更多的示例。readCharsAndReverse在遇到“\n”之前不会停止,因此在“一”的情况下: “o”被扫描。它不是一个字符,所以它继续到下一个字符,即“n”,在“e”之后我们得到“\n”。现在我们转到下一行(因为我们到了基本情况,所以下一行告诉我们打印堆栈中的内容(即“eno”。“e”首先,“n”其次,最后是“o”) 在任何时候编写堆栈时,我都会进行更多的重新编译,看到更多的示例。对,我想这就是您要寻找的答案 您的程序具有所谓的堆栈。每次调用函数时,都会在此堆栈(堆栈帧)上创建空间来保存有关函数的信息。这通常是任何正在修改的寄存器(不要担心),返回地址,或者更确切地说,是调用它的函数,以及该函数使用的任何变量 每次调用
readCharsAndReverse
,都会在堆栈上放置一个新的帧。该帧包含局部变量ch
。当readCharsAndReverse
退出时,当前堆栈帧将被删除(弹出),计算机将从调用readCharsAndReverse
的位置开始执行(在您的示例中,通常在readCharsAndReverse()
行上)。发生这种情况时,ch
的值将保持与再次调用readCharsAndReverse
之前的值完全相同。对,我认为这就是您正在寻找的答案
您的程序具有所谓的堆栈。每次调用函数时,都会在此堆栈(堆栈帧)上创建空间来保存有关函数的信息。这通常是任何正在修改的寄存器(不要担心),返回地址,或者更确切地说,是调用它的函数,以及该函数使用的任何变量
每次调用
readCharsAndReverse
,都会在堆栈上放置一个新的帧。该帧包含局部变量ch
。当readCharsAndReverse
退出时,当前堆栈帧将被删除(弹出),计算机将从调用readCharsAndReverse
的位置开始执行(在您的示例中,通常在readCharsAndReverse()
行上)。发生这种情况时,ch
的值将保持与再次调用readchars和reverse
之前的值完全相同。基本上,函数将字符读入其局部变量ch
,调用自身并打印ch
这意味着
- 第一次调用的readCharsAndReverse将
读入o
并调用自身ch
- 第二次调用readCharsAndReverse将
读入n
并调用自身ch
- 第三次调用readCharsAndReverse将
读入e
并调用自身ch
- 第四次调用readCharsAndReverse读取
并返回到 第三次调用ReadChars和Reverse。\n
- 第三次调用的readCharsAndReverse打印其
,ch
,然后返回到 第二次调用ReadChars和Reverse。e
- 第二次调用的readCharsAndReverse打印其
,ch
,然后返回到 首次调用ReadChars和Reverse。n
- 第一次调用的readCharsAndReverse打印它的
,ch
,我们就完成了o
ch
,调用自身并打印ch
这意味着
- 第一次调用的readCharsAndReverse将
读入o
并调用自身ch
- 第二次调用readCharsAndReverse将
读入n
并调用自身ch
- 第三次调用readCharsAndReverse将
读入e
并调用自身ch
- 第四次调用readCharsAndReverse读取
并返回到 第三次调用ReadChars和Reverse。\n
- 第三次调用的readCharsAndReverse打印其
,ch
,然后返回到 第二次调用ReadChars和Reverse。e
- 第二次调用readCharsAndReverse
readCharsAndReverse(){ ch = 'o'; readreadCharsAndReverse(){ ch = 'n'; readreadCharsAndReverse(){ ch='e'; readreadCharsAndReverse(){ ch='\n';