递归:在其位置反转字符串

时间:2016-11-16 10:25:35

标签: c string recursion reverse

递归。我检查了其他在线解决方案,它们似乎与我的完全相同。 代码应该反转字符串(在其位置),但它不会。例如,当输入为st2 =“abcdefg”时,输出为空字符串。我期待st2 =“gfedcba”。我错过了什么?

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


void recurse_reverse(char s[], int sz)
{
    int i=0,j = sz -1;
    if(i<j)
    {
        swap(&s[i],&s[j]);
        recurse_reverse(s+1, sz-2);

    }
}


void swap( char* s1, char *s2)
{
    char tmp;
    tmp = *s1;
    *s1 = *s2;
    *s2 = tmp;
}


int main(void)
{
    char st1[9] = "abcdefg", st2[9];
    strcpy(st2,st1);
    recurse_reverse(st2,9);
    printf("s1 = %s\ns2 = %s",st1,st2);
    printf("\n" );
    return 0;
}

3 个答案:

答案 0 :(得分:5)

您正在st1的末尾交换2个零字节。因此,st2以空字节开头,因此printf()不打印任何内容。 你只需要修复你的论点传递。而不是

recurse_reverse(st2,9);

DO

recurse_reverse(st2,strlen(st1));

您可能希望添加逻辑以确保目标数组st2有足够的空间。

答案 1 :(得分:3)

我添加了printf语句来调试问题并得到以下输出。您正在尝试访问第9个变量,这是一个已终止的空字符\0,因此您只能获得\0作为输出,而不是实际的反向字符串。

您可以使用strlen来获取字符串长度,而不是硬编码字符串的大小。

1st char = a and 9th char is ▒
1st char = b and 9th char is
1st char = c and 9th char is g
1st char = d and 9th char is f
s1 = abcdefg
s2 = ▒

<强>解决方案

预期的代码更改

recurse_reverse(st2,strlen(st1));

输出

1st char = a and 9th char 9th char is g
1st char = b and 9th char 9th char is f
1st char = c and 9th char 9th char is e
s1 = abcdefg
s2 = gfedcba

答案 2 :(得分:1)

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

void swap( char* s1, char *s2);

void recurse_reverse(char s[], int sz)
{
    int i=0,j = sz-1;
    if(i<j)
    {
        swap(&s[i],&s[j]);
        recurse_reverse(s+1, sz-2);

    }
}


void swap( char* s1, char *s2)
{
    char tmp;
    tmp = *s1;
    *s1 = *s2;
    *s2 = tmp;
}


int main(void)
{
    char st1[9] = "abcdefg", st2[9];
    int len=0;
    strcpy(st2,st1);
    len =strlen(st2);
    recurse_reverse(st2,len);
    printf("s1 = %s\ns2 = %s",st1,st2);
    printf("\n" );
    return 0;
}