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

时间:2014-11-17 14:08:22

标签: 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;
}

输出:

enter image description here

打印我得到的个别字符,

enter image description here

2 个答案:

答案 0 :(得分:9)

你的字符串实际上是6个字节长 - 'h', 'e', 'l', 'l', 'o', '\0'。最后一个字符是空字节,它是一个字符串终止符。它向字符串结束的printfstrlen等函数发出信号。当你调用reverse时,它会反转整个字符串,所以现在终结符是第一个字节,printf将其解释为空字符串。

有两种方法可以解决这个问题。将传递给reverse的索引缩小一个(调用reverse(a, 0, n-2)),或使用strlen代替sizeofint n = strlen(a))。

答案 1 :(得分:1)

永远记住,n元素的数组索引为n-1

您的数组有6个元素,因此索引将从0运行到5,最后[6]元素是NUL终结符。

根据您的逻辑,NUL终结符成为反转数组中的第一个元素,因此没有输出为string

遵循逻辑,您对reverse()的第一次调用应为reverse(a,0,n-2);,以避免将NUL作为反向数组中的第一个元素。