【问题标题】:Recursion: Reverse string in its position递归:在其位置反转字符串
【发布时间】:2017-03-30 12:09:26
【问题描述】:

递归。我检查了其他在线解决方案,它们似乎与我的几乎相同。 代码应该反转字符串(在它的位置),但它没有。例如,当输入为 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;
}

【问题讨论】:

  • 您应该将strlen(st2) 传递给recurse_reverse
  • 您交换的第一个字符是'\0',它成为字符串的结尾。
  • st1 的唯一目的是显示旧值。请删除 st1 并查看代码,我没想到它会让您感到困惑。 recurse_reverse 的函数原型应该是: void recurse_reverse(char s[], int size);假设 st1[9] 不存在,strcpy() 不存在并且 st2[9] ="abcdefg",我想将其反转。谢谢。

标签: c string recursion reverse


【解决方案1】:

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

recurse_reverse(st2,9);

recurse_reverse(st2,strlen(st1));

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

【讨论】:

  • @Jean-FrançoisFabre C 标准使用术语“空字符”来表示'\0'。因此,我认为将其称为“空字节”或任何歧义没有任何问题。
  • 请在我的代码下方查看我的评论。我应该把它放在这里,但我犯了一个错误。此外,在看到您的回复后,通过演绎推理,我输入了 recurse_reverse(st2,strlen(st2));并像魅力一样工作。
  • @usr 正式指出,我永远不知道如何称呼它。至少不是NULL。至少这个答案很好,但我对另外两个很生气。我只是想知道结果如何。
【解决方案2】:

我添加了一个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

【讨论】:

    【解决方案3】:
    #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;
    }
    

    【讨论】:

    • 虽然此代码 sn-p 可以解决问题,包括解释 really helps 以提高您的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2015-08-15
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多