C 使用递归函数反转字符串
我目前正在学习C,我无法通过这个练习。我必须创建一个递归函数,将C 使用递归函数反转字符串,c,string,recursion,reverse,C,String,Recursion,Reverse,我目前正在学习C,我无法通过这个练习。我必须创建一个递归函数,将string1反转为string2。这是我的密码。我非常感谢你的帮助 #include <stdio.h> #define MAX 100 void reverse(char s1[],char s2[],int n,int j); int main() { char string1[MAX]="How Are You Mate"; char string2[MAX]=""; int n=0;
string1
反转为string2
。这是我的密码。我非常感谢你的帮助
#include <stdio.h>
#define MAX 100
void reverse(char s1[],char s2[],int n,int j);
int main()
{
char string1[MAX]="How Are You Mate";
char string2[MAX]="";
int n=0;
int i=0;
int j=0;
for(i=0;string1[i]!='\0';i++)
n++;
reverse(string1,string2,n,j);
printf("String-a normal:\n%s\n",string1);
printf("String-a reverse:\n%s\n",string2);
return 0;
}
void reverse(char s1[],char s2[],int n,int j)
{
if(n>0)
{
s2[j]=s1[n];
reverse(s1,s2,n-1,j+1);
}
else
s2[j]='\0';
}
#包括
#定义最大值100
无效反向(字符s1[],字符s2[],整数n,整数j);
int main()
{
char string1[MAX]=“你的伴侣怎么样”;
字符字符串2[MAX]=“”;
int n=0;
int i=0;
int j=0;
对于(i=0;string1[i]!='\0';i++)
n++;
反向(第1条、第2条、第n条、第j条);
printf(“String-a normal:\n%s\n”,string1);
printf(“String-a反转:\n%s\n”,string2);
返回0;
}
无效反向(字符s1[],字符s2[],整数n,整数j)
{
如果(n>0)
{
s2[j]=s1[n];
反向(s1、s2、n-1、j+1);
}
其他的
s2[j]='\0';
}
反转开始于将string1
数组的n
-th字符复制到string2
中。n
-th字符恰好是空终止符。它将成为新字符串的第一个字符,因此对于所有标准C例程(包括printf
)来说,该字符串看起来都是空的
召唤
reverse(string1,string2,n-1,j);
从主菜单中
可以解决问题。reverse
中的条件也应该从if(n>0)
更改为if(n>=0)
。到位(调用方可以在调用此函数之前复制字符串)字符串反转和尾部递归
void reverse (char *str, size_t len)
{
char tmp;
if (len-- < 2) return;
tmp = *str;
*str = str[len];
str[len] = tmp;
reverse (str+1, len -1);
}
void reverse(字符*str,大小长度)
{
char-tmp;
如果(len--<2)返回;
tmp=*str;
*str=str[len];
str[len]=tmp;
相反(str+1,len-1);
}
O、 如果您不需要指针:
void reverse (char str[], size_t len)
{
char tmp;
if (len-- < 2) return;
tmp = str[0];
str[0] = str[len];
str[len] = tmp;
reverse (str+1, len -1);
}
void reverse(字符str[],大小长度)
{
char-tmp;
如果(len--<2)返回;
tmp=str[0];
str[0]=str[len];
str[len]=tmp;
相反(str+1,len-1);
}
尽管它不会将结果字符串保存在任何地方,但您还是明白了这一点
#include <stdio.h>
void rev (const char* str);
int main () {
const char str[] = "!dlrow ,olleH";
printf("%s\n", str);
rev(str);
printf("\n");
return 0;
}
void rev (const char* str) {
char c = *str;
if (c != '\0') {
rev(str + 1);
printf("%c", c);
}
}
#包括
无效版本(常量字符*str);
int main(){
常量字符str[]=“!dlrow,olleH”;
printf(“%s\n”,str);
rev(str);
printf(“\n”);
返回0;
}
无效版本(常量字符*str){
字符c=*str;
如果(c!='\0'){
修订版(str+1);
printf(“%c”,c);
}
}
我已经更正了程序。请在下面查找更改
void reverse(char s1[],char s2[],int n,int j)
{
if(n>0)
{
s2[j]=s1[n-1];
reverse(s1,s2,--n,++j);
}
else
s2[j]='\0';
}
我建议使用library,size=strlen(数组)代替
for(i=0;string1[i]!='\0';i++)
n++;
要计算arra中有多少个字符,代码编译得很好,问题是当我打印2字符串时,它没有显示任何字符。s2[]代表第二个字符string@Lind,该练习是否提到使用递归函数反转C中的字符串(其“strings”)会带来什么好处无法轻松返回,因此不太适合该模式?它说的和你说的一样。使用递归函数并不能使程序更快,但它仍然要求使用递归函数进行练习。如果不解决此练习,我无法继续。谢谢,这是我一直在寻找的答案。我创建了条件string1[I]!='\for循环中的0,但我从第一个字符开始计数,我想这就是问题所在。我没有在函数上加n-1,但我声明了int n=-1。至于n>=0,这是必要的,谢谢。@Lind在
-1
处启动n
也可以。顺便说一句,您可以从main
中删除j
的声明,因为它被指定为零,并且此后不会更改,因此您可以将0
作为reverse
的最后一个参数传递,以获得相同的效果。我修复了原始解决方案,是的,我理解它,虽然我必须再看一遍指针,因为我对它们没有一个清晰的概念。