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

xxx*_*xxx 2 c recursion

我编写了一个使用递归来反转字符串的程序.但我得到的输出总是一个空字符串.

我想知道我的逻辑有什么问题?

#include<stdio.h>

void reverse(char a[], int start, int end)
{
    char t;
    if(start>=end)
        return;
    else
    {
        t = a[start]; a[start] = a[end]; a[end] = t;
        reverse(a,++start,--end);   
    }
}

int main(void)
{
    char a[] = "hello";
    int n = sizeof(a)/sizeof(a[0]); 
    printf("Given string is : %s ",a);
    reverse(a,0,n-1);
    printf("Reversed string is : %s ",a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

打印我得到的个人字符,

在此输入图像描述

Dan*_*Dan 9

你的字符串实际上是6个字节长 - 'h', 'e', 'l', 'l', 'o', '\0'.最后一个字符是空字节,它是一个字符串终止符.它用信号通知功能,如printf或strlen其中串结束.当你调用时reverse,它会反转整个字符串,所以现在终结符是第一个字节,并将其printf解释为空字符串.

有两种方法可以解决这个问题.将传递的索引设置为reverse较小(调用reverse(a, 0, n-2)),或使用strlen而不是sizeof(int n = strlen(a)).