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

Posted

技术标签:

【中文标题】递归:在其位置反转字符串【英文标题】: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",我想将其反转。谢谢。 【参考方案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您的答案添加解释,并说明适用的限制和假设。

以上是关于递归:在其位置反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

在Java中递归反转字符串的最佳方法是啥?

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

递归:反转字符串

递归:反转字符串

C++:使用递归反转字符串

递归字符串反转函数