【问题标题】:Reverse a string using a recursive function使用递归函数反转字符串
【发布时间】:2013-02-25 15:10:06
【问题描述】:

我目前正在学习 C,但我无法通过这个练习。我必须创建一个递归函数来将string1 反转为string2。这是我的代码。非常感谢您的帮助。

#include <stdio.h>
#define MAX 100

void reverse(char s1[],char s2[],int n,int j);

int main()
{
    char string1[MAX]="How Are You Mate";
    char string2[MAX]="";
    int n=0;
    int i=0;
    int j=0;

    for(i=0;string1[i]!='\0';i++)
        n++;
    reverse(string1,string2,n,j);
    printf("String-a normal:\n%s\n",string1);
    printf("String-a reverse:\n%s\n",string2);
    return 0;
}

void reverse(char s1[],char s2[],int n,int j)
{
     if(n>0)
     {
            s2[j]=s1[n];
            reverse(s1,s2,n-1,j+1);
     }
     else
            s2[j]='\0';
}

【问题讨论】:

  • 代码编译得很好,问题是当我打印 2 个字符串时它没有显示任何字符。
  • s2[] 代表第二个字符串
  • @Lind,该练习是否提到了使用递归函数反转 C 中的字符串可以获得的任何好处,其“字符​​串”不能轻易返回,因此不太适合该模式?
  • 它和你说的一样。使用递归函数不会使程序更快,但它仍然要求使用递归函数进行练习。如果不解决这个练习,我就无法继续。

标签: c string recursion reverse


【解决方案1】:

反转开始于将string1 数组的n-th 字符复制到string2。 n-th 字符恰好是空终止符。它成为新字符串的第一个字符,因此该字符串对于所有标准 C 例程(包括 printf)来说都是空的。

打电话

reverse(string1,string2,n-1,j);

来自main 应该可以解决问题。 reverse 中的条件也应从 if(n&gt;0) 更改为 if(n&gt;=0)。

【讨论】:

  • 谢谢,这是我一直在寻找的答案。我在 for 循环中创建了条件 string1[i]!='\0',但我从第一个字符开始计数,我认为就是这样这里的问题。
  • 我没有把 n-1 放在函数上,但我声明了 int n=-1。至于 n>=0 是必要的,谢谢。
  • @Lind 从n 开始-1 也可以。顺便说一句,您可以从main 中删除j 的声明,因为它被分配为零,之后不会更改,因此您可以将0 作为reverse 的最后一个参数传递,以达到相同的效果.
【解决方案2】:

就地(调用者可以在调用此函数之前制作字符串的副本)字符串反向与尾递归

void reverse (char *str, size_t len)
{
  char tmp;
  if (len-- < 2) return;

  tmp = *str;
  *str = str[len];
  str[len] = tmp;

  reverse (str+1, len -1);
}

哦,如果你不想要指针:

void reverse (char str[], size_t len)
{
  char tmp;
  if (len-- < 2) return;

  tmp = str[0];
  str[0] = str[len];
  str[len] = tmp;

  reverse (str+1, len -1);
}

【讨论】:

  • 我修复了我原来的解决方案,是的,我明白了,尽管我必须再次阅读指针,因为我对它们没有明确的想法。
【解决方案3】:

虽然它不会在任何地方保存生成的字符串,但你明白了。

#include <stdio.h>

void rev (const char* str);

int main () {
    const char str[] = "!dlrow ,olleH";

    printf("%s\n", str);

    rev(str);
    printf("\n");

    return 0;
}

void rev (const char* str) {
    char c = *str;
    if (c != '\0') {
            rev(str + 1);
        printf("%c", c);
    }
}

【讨论】:

    【解决方案4】:

    我已经更正了程序。请在下面找到更改

    void reverse(char s1[],char s2[],int n,int j)
    {
     if(n>0)
     {
            s2[j]=s1[n-1];
            reverse(s1,s2,--n,++j);
     }
     else
            s2[j]='\0';
    }
    

    【讨论】:

      【解决方案5】:

      我建议使用 library , size=strlen(array) 代替

      for(i=0;string1[i]!='\0';i++)
      n++;
      

      计算arra中有多少个字符

      【讨论】:

        猜你喜欢
        • 2011-03-26
        • 2022-01-09
        • 2013-03-20
        • 2017-07-20
        • 1970-01-01
        • 2020-07-27
        • 2011-07-28
        相关资源
        最近更新 更多