2016-11-16 101 views
4

递归。我查了其他在线解决方案,他们似乎与我的非常相似。 代码应该颠倒字符串(在其位置),但它不。例如,当输入为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; 
} 
+2

你应该通过'strlen的(ST2)''来recurse_reverse'。 – Groo

+1

你交换的第一个字符之一是成为字符串末尾的'\ 0'。 – pmg

+0

st1的唯一目的是显示旧的值。请删除st1并查看代码,我没有想到它会混淆你。 recurse_reverse的函数原型应该是:void recurse_reverse(char s [],int size);假设st1 [9]不存在,strcpy()不存在,st2 [9] =“abcdefg”,这是我想要颠倒的。谢谢。 – Mynicks

回答

5

您正在交换st1末尾的2个零字节。因此,st2以空字节开始,因此printf()不会打印任何内容。 你只需要解决你的参数传递。取而代之的

recurse_reverse(st2,9); 

recurse_reverse(st2,strlen(st1)); 

你可能要添加逻辑,以确保您的目的地阵列st2有足够的空间。

+0

@ Jean-FrançoisFabreC标准使用术语“空字符”来表示“\ 0''。所以,我没有看到任何将它称为“空字节”或任何歧义的问题。 – usr

+0

请在我的代码下面查看我的评论。我应该把它放在这里,但我犯了一个错误。另外,在看到你的回答后,通过演绎推理我输入recurse_reverse(st2,strlen(st2));并像魅力一样工作。 – Mynicks

+0

@usr正式指出,我从来不知道如何称呼它。至少不是'NULL'。至少这个答案是好的,但我对另外两个人生气。我只是想知道它会如何结果。 –

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; 
} 
+2

虽然此代码片段可能会解决问题,包括解释[真的有帮助](// meta.stackexchange.com/q/114762)以提高您的帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –

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