我想做一个反转字符串的递归函数,所以我尝试了这段代码,但是它无法正常工作。 我试着解释一下我的代码:
- 我创建了一个名为'concat'的函数,这个函数将两个字符串作为参数并在concatunation之后返回一个字符串
- 在'inv'函数中,有关将一个字符串作为参数反转,我试图在每个循环中连接前一个字符串。
#include <stdio.h>
#include <string.h>
char *concat(char *ch1, char *ch2)
{
char *ch3 = malloc((strlen(ch1) + strlen(ch2) + 1) * sizeof(char));
strcat(ch1, ch2);
strcpy(ch3, ch1);
return (ch3);
}
char *inv(char *ch1, int i, char *ch2)
{
if (i == 0)
{
strncat(ch2, ch1, 1);
return ch2;
}
if (i > 0)
{
return concat(&ch1[i], inv(ch1, i - 1, ch2));
}
}
int main(int argc, char *argv[])
{
char ch1[10];
char ch2[10];
strcpy(ch2, "");
scanf("%s", ch1);
printf("%s", inv(ch1, strlen(ch1) - 1, ch2));
return 0;
}
答案 0 :(得分:2)
这比它需要的更复杂。只需传递两个指向函数的指针:一个指向第一个字符,一个指向最后一个字符。在函数中,交换两个指向的字符,并递归调用函数(显然有一个合适的基本情况来终止递归)。
P.S。如果你只需要打印出字符串,而不需要存储它,那么解决方案就更简单了,包括两个步骤:
答案 1 :(得分:0)
我尝试在您的政策中正确重写。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *concat(char ch, char *str){
char *cats = malloc(1 + strlen(str) + 1);
*cats = ch;
strcpy(cats + 1, str);
free(str);//str is created by malloc
return cats;
}
char *inv(char *str, int last){
/*
if (last == 0)
return concat(str[0], calloc(1, 1));//calloc(1,1) meant ""
if (last > 0)
return concat(str[last], inv(str, last - 1));
*/
return concat(str[last], (last ? inv(str, last - 1) : calloc(1,1)));
}
int main(){
char str[10], *p;
scanf("%s", str);
printf("%s", p=inv(str, strlen(str) - 1));
free(p);
return 0;
}
答案 2 :(得分:0)
如果你想在原地反转字符串,你可以只交换第一个和最后一个字符,然后递归调用你的函数来代替其他字符:
[a b c d e]
e[b c d]a
e d[c]b a
以下是示例实现:
/* Reverse a string, n is string length */
void reverse (char *str, size_t n)
{
/* Terminate recursion - one character string
is already reversed */
if (n <= 1) {
return;
}
/* swap first and last character */
swap(str, 0, n-1); // TODO: implement
/* Reverse "inner" string. "Inner" string
starts one character after original string
and ends one character before, thus is
2 characters shorter */
reverse (str+1, n-2);
}
如果要返回新字符串,可以复制输入字符串并执行反向就地操作,或修改函数以对两个分离缓冲区,输入和输出进行操作。