我必须在递归函数中反转一个字符串,但我不能使用循环或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;
}
我无法绕过如何扭转字符串。我已经找到了空字符使用p的位置,但是如何将字符串向后复制到新字符串上呢?
答案 0 :(得分:3)
#include <stdio.h>
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;
}
答案 1 :(得分:0)
由于这显然是功课,没有完整的解决方案,只有想法。
首先,您不需要将自己限制为一个递归函数。你可以拥有几个,strlen
的强制实现是微不足道的。 {* 1}}如果* p = 0,则评估为0,否则评估为my_strlen(char *p)
。
你也可以在一个递归循环中完成它,但你不必这样做。
还有一件事:当你递归时,你可以在递归的前端和后端运行你的代码。递归就像一个循环;但是在对self返回的嵌套调用之后,你有机会执行另一个循环,这个循环向后。看看你是否可以利用它。
答案 2 :(得分:0)
这很简单。输入字符串时,将字符保存在您所在的位置。递归地调用方法更多字符到右边。当你到达字符串的末尾时,你将有N个堆栈帧,每个帧包含一个N字符串的一个字符。当你返回时,将字符写回,但在返回时递增指针,以便以相反的顺序写入字符。
答案 3 :(得分:0)
我会尝试做得很好并给你一些示例代码。有一些解释。
递归之美是你不需要知道字符串的长度,但字符串必须以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 */
最后,让我们测试一下这个功能。
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'