Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fgets获取输入,并使用递归反向输出答案_C_Arrays_Recursion_Fgets_Putchar - Fatal编程技术网

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

C 使用fgets获取输入,并使用递归反向输出答案,c,arrays,recursion,fgets,putchar,C,Arrays,Recursion,Fgets,Putchar,这是一本书的示例片段。我不明白它是如何反向打印字符串的。第一次调用reverse时,0处的元素不为null,当然假设输入了有效字符串。在else语句中,我们再次调用函数,传递索引1处元素的地址 假设我输入了“hello”。然后我传递e的地址。第二次调用reverse,但是字符串是如何遍历的?正在检查的索引仍然是1。而且,在我看来,我们并没有替换数组的值。当我们开始用putchar打印值时,我感到非常困惑,索引0处的值从数组的最后一个元素开始。我知道,当我们使用递归时,我们碰到了基本情况,因为项目

这是一本书的示例片段。我不明白它是如何反向打印字符串的。第一次调用
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");
    }
}
#包括
无效反向(char*ptr);
int main(){
字符句[10];
printf(“输入文本”);
fgets(第10句,标准文本);
printf(“行为:\n”);
倒装句;
返回0;
}
无效反向(字符*ptr){
如果(ptr[0]='\0'){
返回;
}否则{
反向(&ptr[1]);
putchar(ptr[0]);
printf(“\n”);
}
}

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

&ptr[1]
传递给递归,因此,每次传递的字符串都以下一个字符开头。我建议您花一些时间学习如何使用调试器。有了它,您可以逐行遍历代码,并逐步进入函数调用,同时监视变量及其值。如果您使用递归调用来实现这一点,请密切关注
ptr[0]
ptr[1]
,应该可以清楚地知道发生了什么。@Someprogrammerdude噢,见鬼!当然我知道如何使用调试器,但我没有想到GDB。我现在就去@风向标,谢谢。我将使用调试器来研究这个问题。啊,这太酷了!!在C语言中,我从来没有这样做过递归,因为我是从Java开始的。我现在明白发生了什么。不是我们以传统的方式遍历字符串,而是每次索引在0和1发生变化时都发送起始地址,因为我们正在“吃掉”数组。感谢您的回复:)