使用递归在C语言中反转字符串

3

我已经写了一段C代码来反转字符串...这段代码可以正常工作,但我无法在main()函数中返回反转后的字符串。

#include<stdio.h>

main()
{
  char a[17]="abcdefg";
  reverse(a);
  printf("\n");
  system("PAUSE");
}
int reverse(char *a)
{
   if(*a!='\0')
   {   
     reverse(a+1);
   }
   printf("%c",*a);
}         

它打印了反转的字符串,但我想在main()中得到反转后的字符串。我该怎么做?


这是一项作业任务吗? - happyhairydude
不,我正在学习递归。 - Amol Singh
“int reverse()” 函数至少应该返回一个整数。 - wildplasser
1
你必须在字符串中交换字符(原地反转),而不是将它们打印出来。递归解决方案效率低下,但相当容易实现。 - Brian White
不要把注意力放在大多数无用的知识上,比如递归,而应该关注有用的知识,比如C99/C11以及如何在现代C中编写函数原型。你的代码包含几个错误,它们与递归无关,而是与基本的C编程有关。 - Lundin
12个回答

6
以下是使用递归反转字符串的一种方法!
#include <stdio.h>
#include <string.h>

void rev_str_recursive(char arr[], size_t iStart, size_t iLast)
{
    if( iStart < iLast )
    {
        //swap
        char temp = arr[iStart];
        arr[iStart] = arr[iLast];
        arr[iLast] = temp;

        rev_str_recursive(arr, ++iStart, --iLast);  
    }
}

void main()
{
    char cArray[] = {"A quick brown fox jumps over a lazy dog"};

    rev_str_recursive(cArray, 0, strlen(cArray)-1);
}

1
由于在函数的原始调用中有-1,所以当字符串为空时(因此strlen(cArray)为0,因此传递为iLast的值是size_t的最大值),这会导致严重失败。您可以通过将其称为rev_str_recursive(cArray,strlen(cArray))来简化接口,并仅在iLast> 2时将递归调用排列为rev_str_recursive(arr + 1,iLast-2);。当然,由于它是尾递归,因此可以将代码优化为循环而不是递归。 - Jonathan Leffler
感谢您的反馈,我同意您的观点,如果字符串为空,这将失败! - AFI

5
您需要修改字符串,即将输入缓冲区传递给reverse()函数,而不仅仅是打印它。
这样做递归似乎有点繁琐,但当然是可行的。
基本上,我想打印就变成了赋值,就像这样:
  1. 基础:空字符串的反转是空字符串。
  2. 步骤:字符串的反转从交换第一个和最后一个字符开始,然后递归处理其余部分。

2

以下是使用递归反转字符串的另一种方法:

void reverseString(char* dest, char *src, int len) {
    if (src == NULL || len == 0)
        return;

    reverseString(dest, src + 1, len - 1);
    strncat_s(dest, len + 1, src, 1);
}

你可以这样调用:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define STRING "Let's try this one."
#define SIZE 20

void main() {

    char* src = (char*)malloc(SIZE);
    char* dest = (char*)malloc(SIZE);

    strcpy_s(dest, SIZE, "");
    strcpy_s(src, SIZE, STRING);

    reverseString(dest, src, strlen(src));
    /* Do anything with dest. */
    // printf("%s\n", dest);

    free(src);
    free(dest);
}

0
#include <iostream>
using namespace std;

reverse( char *str)
{
    if (*str!='\0')
    {
       reverse(str+1);
       cout<<*str;
    }
//cout<<*str   when i am just printing here then why this is printing after one space ??
}

int main()
{   
    string a ;  
    cin>>a;   
    reverse(&a[0]); 
    return 0;
}

1
这不是答案,而是你复制和粘贴代码。另外,请在回答代码片段时使用 code 缩进。 - searchengine27

0

使用左右索引的简单方法

void main()
{
    char* str = (char*)malloc(strlen("somestring")+1);
    strcpy(str, "somestring");
    int leftIndex = 0;
    int rightIndex = strlen(str) - 1;
    
    printf("%s\n", ReverseString(str, leftIndex, rightIndex));
    free(str);
}

char* ReverseString(char* str, int leftIndex, int rightIndex)
{
    if (leftIndex == rightIndex || leftIndex == (rightIndex +1)) {
        return str;
    }

    // flip letters
    char leftLetter = *(str + leftIndex);
    char rightLetter = *(str + rightIndex);
    *(str + leftIndex) = rightLetter;
    *(str + rightIndex) = leftLetter;

    return ReverseString(str, leftIndex+1, rightIndex -1);
}

0

这段代码无法执行 :( 你定义了int reverse,但是reverse函数没有返回任何值

相反,使用以下代码(使用void):

#include<stdio.h>

main()
{
  char a[17]="abcdefg";
  reverse(a);
  printf("\n");
  system("PAUSE");
}
void reverse(char *a)
{
   if(*a!='\0')
   {   
     reverse(a+1);
   }
   printf("%c",*a);
}        

这会如何改变 a 的值? - Bill Lynch

0
Emre Can Kucukoglu的答案稍作修改... 我们可以消除strncat_s。
void revstr_rec(char *sstr, char *dstr, int len)
{
    int i = 0;
    if((! *sstr) || (! len) )
        return;

    revstr_rec(sstr + 1, dstr, len - 1);
    dstr[len - 1] = *sstr;

    return;
}

int main()
{
    char *sstr = NULL;
    char *dstr = NULL;

    sstr = malloc(16);
    if(! sstr)  {
        printf("no memory . . .\n");
        return 0;
    }
    strcpy(sstr, "hello world !");
    printf("sstr: %s\n", sstr);

    dstr = malloc(16);
    if(! dstr)  {
        printf("no memory . . .\n");
        return 0;
    }

    revstr_rec(sstr, dstr, strlen(sstr));
    printf("dstr(recursive): %s\n", dstr);

    free(sstr);
    free(dstr);

    return 0;
}

0
#include <stdio.h>
#define MAX 100
int main()
{
char str[MAX], *rev;
scanf("%s", str);
rev = reverse(str); 
printf("The reversed string is : %s\n", rev);
return 0;
}
char *reverse(char ch[])
   {
    static char r[MAX];
    static int i=0;
    if(*ch == '\0') return "";
    else 
   {
    reverse(ch+1);
    r[i++]=*ch;
   }
    return r;
   }

-1

使用sprintf函数,它会将您的反转字符串打印到缓冲区中。

#include<stdio.h>

char *b;

main()
{
  char a[17]="abcdefg";
  char buffer[17];
  buffer[0]= '\0';
  b = buffer;
  reverse(a);
  printf("%s\n",buffer);
}
int reverse(char *a)
{
   if(*a!='\0')
   {   
     reverse(a+1);
     sprintf(b,"%c",*a);
     b++;
   }

}

char buffer[17]后面缺少一个分号。另外,buffer不是左值,所以不能使用buffer++; - wildplasser

-1
void palindromo(char *s)
{
    if(s[0] != '\0'){
        palindromo(s+1);
        printf("%c", s[0]);
    }
}

这是一个小的递归函数,它可以倒序打印字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接