首页 > 解决方案 > 使用 fgets 获取输入并使用递归反向输出答案

问题描述

这是一本书的示例片段。我不明白它是如何反向打印字符串的。第一次reverse调用时,0 处的元素不为空,假设当然输入了有效的字符串。在else语句中,我们再次调用函数,传入索引 1 处元素的地址。

所以假设我输入"hello". 然后我传递e. 第二次reverse调用,但是,字符串是如何遍历的?被检查的索引仍然是 1。另外,在我看来,我们并没有替换数组的值。当我们开始打印这些值时,putchar我感到非常困惑,以至于索引 0 处的值从数组的最后一个元素开始。我知道当我们使用递归并且我们遇到基本情况时,并且由于项目被放在堆栈上,我们从堆栈指针的顶部开始读取它们直到结束,这就是为什么相反。但在这里我看不到这种情况发生。

硬编码索引位于

reverse( &ptr[1]);
putchar(ptr[0]);

对我没有意义。我想当在递归中每次都传递相同的地址时,我很难看到字符串是如何被遍历的。请帮助我了解发生了什么。

为了简单起见,我对代码进行了一些修改,但它的作用与书中的相同。

#include <stdio.h>

void reverse(char * ptr);

int main(){
    char sentence[10];
    printf("enter text \n");
    fgets(sentence, 10, stdin);
    printf("The line is: \n");
    reverse(sentence);
    return 0;
}

void reverse( char * ptr){
    if(ptr[0] == '\0'){
        return;
    } else{
        reverse( &ptr[1]);
        putchar(ptr[0]);
        printf("\n");
    }
}

标签: carraysrecursionfgetsputchar

解决方案


&ptr[1]相当于ptr + 1。_ 现在,如果您将其ptr视为一个数字(实际上确实如此),那么很明显,每次传递的数字不是相同的,而是每个递归级别都大一个。它基本上是从第二个字符开始传递一个子字符串,只有在 C 中,子字符串不是一个单独的对象,而是指向同一字符串中不同位置的指针。


推荐阅读