c - 使用 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");
}
}
解决方案
&ptr[1]
相当于ptr + 1
。_ 现在,如果您将其ptr
视为一个数字(实际上确实如此),那么很明显,每次传递的数字不是相同的,而是每个递归级别都大一个。它基本上是从第二个字符开始传递一个子字符串,只有在 C 中,子字符串不是一个单独的对象,而是指向同一字符串中不同位置的指针。
推荐阅读
- model - 如何在 libgdx 中首先缩放然后旋转模型实例
- flutter - Flutter - 每次我重新打开小部件时,TextField 都是空的
- python - 从数据框中选择行,其中列值是字符串列表
- python - 使用 f.readline() 读取特定行 - Discord.py
- python - 在非数字列中搜索字符串值
- c# - 显示项目集合视图的先前位置
- javascript - 启用暗模式时JS更改浏览器选项卡图标
- javascript - 以时间间隔从服务器下载图像
- swift - 如何在 Swift 中获得侧边栏打开状态?
- retrofit - Retrofit Authenticator 调用但不工作