在C中递归地反转一个字符串?

我必须在递归函数中反转一个字符串,但我不能使用循环或strlen来查找字符串结尾的位置。 然后我必须将反转的字符串传递回main并将其复制到新文件。 这是我到目前为止所拥有的:

int reverse(char *str, char *strnew, int p) { char temp=str[p]; if(temp=='\0' || temp=='\n') { strnew=str; return p; } else { reverse(str++, strnew, ++p); p--; strnew[p]=str[p]; printf("strnew: %c\n", strnew[p]); return 0; } } int main(int argc, char *argv[]) { FILE *fp; char buffer[100]; char newstr[100]; int pointer=0; fp=fopen("lab8.txt", "r"); if(fp==NULL) { printf("Error opening file\n"); return 0; } (fgets(buffer, 100, fp)); reverse(buffer, newstr, pointer); printf("newstr: %s\n", newstr); FILE *fp2=fopen("lab8.2.txt", "w"); fputs(newstr, fp2); fclose(fp); fclose(fp2); return 0; } 

我无法绕过如何扭转字符串。 我已经找到了null字符使用p的位置,但是如何将字符串向后复制到新字符串上?

 #include  int reverse(char *str, int pos){ char ch = str[pos]; return (ch == '\0')? 0 : ((str[pos=reverse(str, ++pos)]=ch), ++pos); } int main(){ char buffer[100]; scanf("%99[^\n]", buffer); reverse(buffer, 0); fprintf(stdout, "%s\n", buffer); return 0; } 

由于这显然是功课,没有完整的解决方案,只有想法。

首先,您不需要将自己限制为一个递归函数。 你可以有几个,并且strlen一个可靠的实现是微不足道的。 my_strlen(char *p)如果* p = 0则求值为0,否则求值为1 + my_strlen(p+1)

您也可以在单个递归循环中执行此操作,但您不必这样做。

还有一件事:当你递归时,你可以在递归的前端和后端运行你的代码。 递归就像一个循环; 但是在对self返回的嵌套调用之后,你有机会执行另一个循环,这个循环向后。 看看你是否可以利用它。

这很简单。 输入字符串时,将字符保存在您所在的位置。 递归调用该方法更多字符到右边。 当你到达字符串的末尾时,你将有N个堆栈帧,每个帧包含一个N字符串的一个字符。 当您返回时,将字符写回,但在返回时递增指针,以便以相反的顺序写入字符。

我会尽力做到并给你一些示例代码。 有一些解释。

递归之美在于您不需要知道字符串的长度,但字符串必须以null结尾。 否则,您可以为字符串长度添加参数。

您需要考虑的是最后一个输入字符是您的第一个输出字符,因此您可以一直递归到结尾,直到您到达字符串的末尾。 一旦你到达字符串的末尾,你就开始将当前字符附加到输出字符串(最初设置为空)并将控制权返回给调用者,调用者随后会将前一个字符附加到输出字符串。

 void reverse(char *input, char *output) { int i; if(*input) /* Checks if end of string */ reverse(input+1,output); /* keep recursing */ for(i=0;output[i];i++); /* set i to point to the location of null terminator */ output[i]=*input; /* Append the current character */ output[i+1]=0; /* Append null terminator */ } /* end of reverse function and return control to caller */ 

最后,让我们测试一下这个function

 int main(argc, argv) { char a[]="hello world"; char b[12]="\0"; reverse(a,b); printf("The string '%s' in reverse is '%s'\n", a, b); } 

产量

The string 'hello world' in reverse is 'dlrow olleh'