【问题标题】:Reverse a string in c using recursion [closed]使用递归反转c中的字符串[关闭]
【发布时间】:2013-04-15 23:30:30
【问题描述】:

所以,我想要求用户输入一个单词,然后程序会反转它。这是我的代码,但无法正常运行。怎么了?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char anadr(int, int, char pin[]);

main()
{
      char pin[100];
      int l;
      int i=0;
      char res;
      printf("Give word: ");
      scanf("%s", pin);
      l=strlen(pin);
      res=anadr(i,l,pin);
      system("pause");
}

char anadr(int i, int l, char pin[])
{
     if(i<l)
        anadr(i++,l,pin);
     printf("%c", pin[i]);
}

【问题讨论】:

  • 到底是什么问题?我还建议在您的main 中使用return 0
  • 另外,你的 anadr 函数应该是 void 而不是 charas 它不返回任何东西。
  • 程序崩溃了。如果我猜对了,那么问题就在那里: if(i
  • 你是对的。我将它从 char 调整为 void 但仍然没有。
  • 此代码也不会反转字符串。但是,它会在反向 printing 字符串时很好地失败。那么你真正想要做什么呢?打印反了?反转吗?两者都有?

标签: c function recursion


【解决方案1】:

为什么不

void anadr(int l, char pin[])
{
     if(l == 0)
          return;

     printf("%c", pin[l - 1]);
     anadr(l - 1, pin);
}

anadr(5, "abcde");

【讨论】:

  • @NorTee 如果您觉得有用,请接受。
【解决方案2】:

您的所有代码似乎都在尝试反向打印字符串。只需递归到终止符并在退出的过程中转储字符。

void anadr(const char *p)
{
    if (!*p)
        return;
    anadr(p+1);
    putchar(*p); 
}

【讨论】:

    【解决方案3】:

    你有一个错误,你不应该使用 ++。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void anadr(int, int, char pin[]);
    
    int main()
    {
          char pin[100];
          int l;
          int i=0;
          //char res;
          printf("Give word: ");
          scanf("%s", pin);
          l=strlen(pin);
          anadr(i,l,pin);
          //system("pause");
    }
    
    void anadr(int i, int l, char pin[])
    {
         if(i<l-1)
            anadr(i+1,l,pin);
         printf("%c", pin[i]);
    }
    

    【讨论】:

      【解决方案4】:

      这里至少有一个问题:

      if(i<l)
          anadr(i++,l,pin);
      

      这会导致无休止的递归,因为 i++ 仅在 它的当前值作为参数传递之后才增加 i。尝试将i++ 替换为i + 1

      此外,即使使用上述修复,比较也会导致进行额外的调用; pin[l] 处的字符是终止 NUL,您几乎肯定不想打印它。所以比较应该是if (i+1 &lt; l)

      【讨论】:

      • 是的。它工作正常。但是,为什么 ++i 的工作方式与 i+1 不同?
      • @NorTee i++ 计算为 i before 的值加一。 ++i 确实适用于递归,因为它计算为 i 递增之后的值。但是其中任何一个都是错误的,因为++ii++更改 i 的值,并且以下行(printf("%c", pin[i]))只有在i 的值才能正常工作没有改变……
      • 另一种可行的方法是if (++i &lt; l) anadr(i,l,pin); printf("%c", pin[i-1]);(如果l 为0,则这些都不能正常工作;那么你不应该打印任何东西)。 (顺便说一句,如果您觉得这有帮助,请为答案投票。)
      猜你喜欢
      • 2014-02-22
      • 2019-08-09
      • 2015-09-27
      • 1970-01-01
      • 2012-09-24
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多