递归:在其位置反转字符串
Recursion: Reverse string in its position
递归。我检查了其他在线解决方案,它们似乎与我的几乎相同。
代码应该反转字符串(在它的位置),但它没有。例如,当输入为 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;
}
您正在交换 st1
末尾的 2 个零字节。因此,st2
以空字节开头,因此 printf() 不打印任何内容。
你只需要修复你的参数传递。而不是
recurse_reverse(st2,9);
做
recurse_reverse(st2,strlen(st1));
您可能想要添加逻辑以确保您的目标数组 st2
有足够的 space.
#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;
}
我添加了一个 printf
语句来调试问题并得到以下输出。您正在尝试访问第 9 个变量,它是一个终止的空字符 [=14=]
因此您只会得到 [=14=]
作为输出而不是实际的反转字符串。
您可以使用 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
递归。我检查了其他在线解决方案,它们似乎与我的几乎相同。 代码应该反转字符串(在它的位置),但它没有。例如,当输入为 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;
}
您正在交换 st1
末尾的 2 个零字节。因此,st2
以空字节开头,因此 printf() 不打印任何内容。
你只需要修复你的参数传递。而不是
recurse_reverse(st2,9);
做
recurse_reverse(st2,strlen(st1));
您可能想要添加逻辑以确保您的目标数组 st2
有足够的 space.
#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;
}
我添加了一个 printf
语句来调试问题并得到以下输出。您正在尝试访问第 9 个变量,它是一个终止的空字符 [=14=]
因此您只会得到 [=14=]
作为输出而不是实际的反转字符串。
您可以使用 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