如何在C中使用递归重复一个单词?
这是一个家庭作业,但我的输出不正确。赋值是使用递归将单词“s”重复“n”次。我不知道我是否错过了一些明显的东西,或者我走错了方向。以下是我目前掌握的代码:如何在C中使用递归重复一个单词?,c,recursion,word,repeat,C,Recursion,Word,Repeat,这是一个家庭作业,但我的输出不正确。赋值是使用递归将单词“s”重复“n”次。我不知道我是否错过了一些明显的东西,或者我走错了方向。以下是我目前掌握的代码: #include <stdio.h> #include <string.h> #include <stdlib.h> char* repeat(char* s,int n){ int len = strlen(s); char* temp = (char*)malloc(n*len*siz
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* repeat(char* s,int n){
int len = strlen(s);
char* temp = (char*)malloc(n*len*sizeof(char));
if(n == 1){
strcpy(temp,s);
return (temp);
}
else{
//temp = (char*)realloc(temp, n*len*sizeof(char));
return (strcat(temp, repeat(s, n-1)));
}
}
int main(void) {
char* s = repeat("string", 3);
printf("Result: "); fflush(stdout);
puts(s);
return (EXIT_SUCCESS);
}
#包括
#包括
#包括
字符*重复(字符*s,整数n){
int len=strlen(s);
char*temp=(char*)malloc(n*len*sizeof(char));
如果(n==1){
strcpy(温度,s);
返回(临时);
}
否则{
//temp=(char*)realloc(temp,n*len*sizeof(char));
返回(strcat(温度,重复(s,n-1));
}
}
内部主(空){
char*s=重复(“字符串”,3);
printf(“结果”);fflush(标准输出);
卖出(s);
返回(退出成功);
}
我得到的输出是:Result:Ø
QQstring
而它应该是字符串
非常感谢您的帮助。主要问题是您要应用的
strcat
的temp
未初始化。最后一个递归步骤中的temp
是另一个新分配的,并在strcat
的第二个参数中使用
除此之外,如前所述,缓冲区太小
备选解决方案的粗略建议(未经测试)
主要问题是您要应用的strcat的
temp
未初始化。最后一个递归步骤中的temp
是另一个新分配的,并在strcat
的第二个参数中使用
除此之外,如前所述,缓冲区太小
备选解决方案的粗略建议(未经测试)
你把它复杂化了。只要这样做:
void repeat(char* s,int n){
printf("%s", s);
if(n > 1)
repeat(s, n-1);
}
int main(void) {
printf("Result: ");
repeat("string", 3);
fflush(stdout);
return (EXIT_SUCCESS);
}
你把它复杂化了。只要这样做:
void repeat(char* s,int n){
printf("%s", s);
if(n > 1)
repeat(s, n-1);
}
int main(void) {
printf("Result: ");
repeat("string", 3);
fflush(stdout);
return (EXIT_SUCCESS);
}
当
n!=1
您在temp
上运行strcat
,而不初始化它。也许你想要提升strcpy(temp,s)代码>从if
中输出。检查strcat的参数-在调用它之前将它们打印出来可能会有帮助…malloc没有意义。您需要malloc字符串中的字符数+1(对于空终止字符),而不是n*strlen(s)
。参数是s,我要重复的单词可以是任何单词。当n!=1
您在temp
上运行strcat
,而不初始化它。也许你想要提升strcpy(temp,s)代码>从if
中输出。检查strcat的参数-在调用它之前将它们打印出来可能会有帮助…malloc没有意义。您需要malloc字符串中的字符数+1(对于空终止字符),而不是n*strlen(s)
。参数是s,我想重复的单词可以是任何单词。如果只是为了打印,那么红色警报的解决方案更优雅。如果目的是分配和创建一个包含字符串的缓冲区,则此解决方案可以…7.21.3.1 strcat函数2。如果复制发生在重叠的对象之间,则行为未定义@BLUEPIXY完全正确,感谢您注意到这一点。我现在修改了代码以避免重叠…@jdehaanlen
未定义。也许你的意思是strlen(s)
。如果只是为了打印,那么红色警报的解决方案就更优雅了。如果目的是分配和创建一个包含字符串的缓冲区,则此解决方案可以…7.21.3.1 strcat函数2。如果复制发生在重叠的对象之间,则行为未定义@BLUEPIXY完全正确,感谢您注意到这一点。我现在修改了代码以避免重叠…@jdehaanlen
未定义。也许你的意思是strlen(s)
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *repeat(char *s, int n){
int len = strlen(s);
char *temp;
if(n == 1){
temp = malloc(len + 1);
memcpy(temp, s, len + 1);
return temp;
}
temp = repeat(s, n-1);
temp = realloc(temp, n * len + 1);
memcpy(temp + (n-1)*len, temp, len + 1);
return temp;
}
int main(void) {
char* s = repeat("string", 3);
printf("Result: "); fflush(stdout);
puts(s);
free(s);
return (EXIT_SUCCESS);
}
//Simplification
char *repeat(char *s, int n){
if(n == 0){
return NULL;
}
int len = strlen(s);
char *temp = realloc(repeat(s, n-1), n * len + 1);
memcpy(temp + (n-1)*len, s, len + 1);
return temp;
}