c-使用fgets获取输入,并使用递归反向输出答案



这是一本书的示例片段。我不明白它是如何反向打印字符串的。第一次调用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] == ''){
return;
} else{
reverse( &ptr[1]);
putchar(ptr[0]);
printf("n");
}
}

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

最新更新