【问题标题】:Recursively reversing a string in C?递归反转C中的字符串?
【发布时间】:2014-05-27 08:06:03
【问题描述】:

我必须在递归函数中反转一个字符串,但我不能使用循环或 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,但是如何将字符串向后复制到新字符串上?

【问题讨论】:

  • 请谷歌搜索。这个问题在过去的 2-3 周内出现了好几次,所以想必你同学得到的答案对你也有好处。

标签: c string recursion reverse


【解决方案1】:
#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;
}

【讨论】:

  • @SevaAlekseyev - 这确实很聪明,但学生也可以很聪明。我很确定 BLUEPIXY 曾经是一名学生。如果需要,OP 可以使其不那么简洁。
  • 教授会知道她班上谁聪明谁不聪明。无论如何,家庭作业问题的完整代码?..
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我会尽力表现得很好,并给你一些示例代码。加上一些解释。

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

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

      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'

      【讨论】:

      • 我认为不能使用for
      • 如果确实禁止OP使用for,那么我将传递一个int参数来跟踪字符位置。感谢您指出这一点。
      猜你喜欢
      • 2012-09-24
      • 2020-06-07
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多