我必须在递归函数中反转一个字符串,但我不能使用循环或strlen来查找字符串结尾的位置。 然后我必须将反转的字符串传递回main并将其复制到新文件。 这是我到目前为止所拥有的:
int reverse(char *str, char *strnew, int p) { char temp=str[p]; if(temp==' ' || temp=='n') { strnew=str; return p; } else { reverse(str++, strnew, ++p); p--; strnew[p]=str[p]; printf("strnew: %cn", 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 filen"); return 0; } (fgets(buffer, 100, fp)); reverse(buffer, newstr, pointer); printf("newstr: %sn", 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 : ((str[pos=reverse(str, ++pos)]=ch), ++pos); } int main(){ char buffer[100]; scanf("%99[^n]", buffer); reverse(buffer, 0); fprintf(stdout, "%sn", 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]=" "; reverse(a,b); printf("The string '%s' in reverse is '%s'n", a, b); }
产量
The string 'hello world' in reverse is 'dlrow olleh'
以上就是c/c++开发分享在C中递归地反转一个字符串?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562627.html