递归:在其位置反转字符串
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您的答案添加解释,并说明适用的限制和假设。以上是关于递归:在其位置反转字符串的主要内容,如果未能解决你的问题,请参考以下文章