在C语言中使用递归反转字符串的方法对我来说很奇怪

在C语言中使用递归反转字符串的方法对我来说很奇怪,c,recursion,character,printf,scanf,C,Recursion,Character,Printf,Scanf,在我的大学笔记中,我发现了下面的代码来反转C中的字符串。我不明白这个例子中的递归是如何工作的,因为我觉得它很神奇!更具体地说,如果我键入单词“one”,程序将打印出单词“eno”。根据解释,该函数递归地从用户读取字符,直到用户按Enter('\n'),然后打印出相反的单词。但是,如果函数最后一次递归调用自己是在用户按下Enter键之后,程序无法再次进入函数以调用printf,那么如何打印单词呢?它是否使用了某种缓冲区以及它是如何工作的??以下是C源代码: #include <stdio.h

在我的大学笔记中,我发现了下面的代码来反转C中的字符串。我不明白这个例子中的递归是如何工作的,因为我觉得它很神奇!更具体地说,如果我键入单词“one”,程序将打印出单词“eno”。根据解释,该函数递归地从用户读取字符,直到用户按Enter('\n'),然后打印出相反的单词。但是,如果函数最后一次递归调用自己是在用户按下Enter键之后,程序无法再次进入函数以调用printf,那么如何打印单词呢?它是否使用了某种缓冲区以及它是如何工作的??以下是C源代码:

#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读取
    \n
    返回到 第三次调用ReadChars和Reverse。

  • 第三次调用的readCharsAndReverse打印其
    ch
    e
    ,然后返回到 第二次调用ReadChars和Reverse。

  • 第二次调用的readCharsAndReverse打印其
    ch
    n
    ,然后返回到 首次调用ReadChars和Reverse。

  • 第一次调用的readCharsAndReverse打印它的
    ch
    o
    ,我们就完成了


基本上,函数将字符读入其局部变量
ch
,调用自身并打印
ch

这意味着

  • 第一次调用的readCharsAndReverse将
    o
    读入
    ch
    并调用自身

  • 第二次调用readCharsAndReverse将
    n
    读入
    ch
    并调用自身

  • 第三次调用readCharsAndReverse将
    e
    读入
    ch
    并调用自身

  • 第四次调用readCharsAndReverse读取
    \n
    返回到 第三次调用ReadChars和Reverse。

  • 第三次调用的readCharsAndReverse打印其
    ch
    e
    ,然后返回到 第二次调用ReadChars和Reverse。

  • 第二次调用readCharsAndReverse
    readCharsAndReverse(){
         ch = 'o';
           readreadCharsAndReverse(){
             ch = 'n';
                 readreadCharsAndReverse(){
                     ch='e';
                      readreadCharsAndReverse(){
                          ch='\n';