使用fgets输入并通过递归反向输出答案

时间:2018-12-31 16:54:04

标签: c arrays recursion fgets putchar

这是一本书的示例片段。我不明白它是如何反向打印字符串的。第一次调用reverse时,假定输入了有效的字符串,则0处的元素不为null。在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");
    }
}

1 个答案:

答案 0 :(得分:0)

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