【问题标题】:How do I write a recursive function to print a string in reverse in C?如何编写递归函数以在 C 中反向打印字符串?
【发布时间】:2020-10-24 21:04:09
【问题描述】:

我需要使用递归反向打印任何给定的字符串。我尝试通过更改函数 stringReverse 的返回值类型和参数列表来更改函数原型和定义。这个标准输出没有为反向字符串打印任何东西,我不知道为什么。

#include <stdio.h>
#define SIZE 100
char stringReverse(void);
size_t i;
unsigned int pass;
int hold;
char a1[SIZE]; 
char a2[SIZE]; 
int main(void) {
    for (i = 0; i < SIZE; ++i) {
        a1[i] = 0;
    }
    
    printf("Enter a string: ");
    scanf_s("%[^\n]99s", a1);

    printf("%s%s\n\n", "string is:\n", a1);
    
stringReverse();
}

char stringReverse(void)
{
    for (pass = 1; pass < SIZE; ++pass) {
        if (a1[i] < a1[i + 1]) {
            hold = a1[i];
            a1[i] = a1[i + 1];
            a1[i + 1] = hold;
        }
    }
    printf("%s%s", "reverse is:\n", a2);
}
    

【问题讨论】:

  • 你写的不是递归函数。此外,对于这项工作,递归将是一个巨大的过度杀伤力。您可以改为使用反向 for 循环或 strrev
  • 0-char 字符串的反转就是它本身; n-char 字符串的反转是 (n-1)-char 字符串的反转,从第 2 个字符开始,然后是第一个字符
  • 我还在学习递归。似乎我试图使用迭代语句来解决问题。我会继续努力的。

标签: c recursion reverse c-strings function-definition


【解决方案1】:

您没有以相反顺序输出字符串的递归函数。此外,当函数依赖于全局变量时也是一个坏主意。

该函数可以如下所示,如下面的演示程序所示。使用该函数,您将能够在任何流中以相反的顺序输出字符串,例如在文件中。

#include <stdio.h>

FILE * string_reverse_output( const char *s, FILE *fp )
{
    if ( *s )
    {
        string_reverse_output( s + 1, fp );
        fputc( *s, fp );
    }
    
    return fp;
}

int main(void) 
{
    fputc( '\n', string_reverse_output( "Hello World!", stdout ) );
    
    return 0;
}

程序输出是

!dlroW olleH

【讨论】:

    【解决方案2】:

    递归对于这项工作来说是一个巨大的过度杀伤力。但是,如果需要,@VladfromMoscow 仍然使用递归给出了一个很好的答案。我可以冒昧地提出一个更好的解决方案吗?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        printf("Enter your string: ");
        char str[100];
        scanf("%[^\n]s",str);
        str = strrev(str);
        printf("%s",str);
        return 0;
    }
    

    关于strrev如何工作的更多信息,我建议你看看strrev() function in C

    【讨论】:

      【解决方案3】:

      以下是用于反转字符串的递归函数,第一个仅用于打印,第二个在 revstr 缓冲区中构建字符串并将其返回给调用者。

      void reverse(char *str) 
      { 
         if (*str) 
         { 
             reverse(str+1); 
             printf("%c", *str); 
         } 
      } 
      
      
      void recrev(char* str, char* revstr, int i)
      {
         if (*str) 
         {
             recrev(str+1, revstr, i-1);
             sprintf(revstr + i, "%c", *str);    
         }
         
      }
      
      
      int main()
      {
          
          char arr[]="hello";
          char revstr[6];
          recrev(arr, revstr, 4);
          printf("%s",revstr);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-19
        • 2015-05-12
        • 2023-03-28
        • 2013-12-07
        • 2014-03-28
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 2013-05-11
        相关资源
        最近更新 更多