问题是写出要求的斐波那契单词。例如,如果输入为0,则f(0)= a,如果1,f(1)= b,类似地,f(2)= ba,f(3)= bab,f(4)= babba,依此类推。我编写了以下代码以在Ubuntu 18.04 LTS Terminal上查找输出。我得到n = 0,1,2,3的正确输出。但是对于n = 4,我得到的是巴贝而不是babba。我也尝试调试,但找不到代码出了问题。请帮助我发现错误。
#include <stdio.h>
#include <string.h>
void fibonacci(int n);
int main()
{
int x;
printf("Enter the fibonacci nword number you want to see:(f(x), f(0) is the starting element.):\n");
scanf("%d",&x);
printf("Required Word is:\n");
fibonacci(x);
return 0;
}
void fibonacci(int n)
{
int i,j=0;
char *p,*q,*r;
if(n==0)
{
printf("a\n");
}
else if(n==1)
{
printf("b\n");
}
else
{
char str1[100] = "a";
char str2[100] = "b";
char str3[100];
p = str1;
q = str2;
r = str3;
for(i=0;i<n-1;i++)
{
*r = *q;
strcat(str2,str1);
*p = *r;
}
printf("%s\n",str2);
}
}
答案 0 :(得分:1)
因为您不知道自己在做什么。
您要静态声明3个char []变量,将它们分配给char *类型的指针,甚至不能正确使用它们。
让我们分析一下代码的一部分:
for(i=0;i<n-1;i++)
{
*r = *q;
strcat(str2,str1);
*p = *r;
}
这样做,对于高于4的任何内容,您只会得到“ babbbbbbbbbb” ...
我的建议:如果要静态声明一些变量,请停止使用指针访问它们。尝试将str1 / str2作为向量访问。
答案 1 :(得分:1)
您的代码被混淆了。我将其修改为:
#include <stdio.h>
#include <string.h>
char*fib(int n)
{
if (0==n)
return "a";
else if (1==n)
return "b";
else
{
char static out[2000]={'b', 'a'};
int idx=2, prev=1, tmp;
n-=2;
while(n--)
{
/* invariant: all values start at the beginning of `out`.
idx: keep the length of the current object
prev: keep the size of previous object
*/
memcpy(out+idx, out, prev);
tmp=prev;
prev=idx;
idx+=tmp;
}
return out;
}
}
int main()
{
int x;
printf("Enter the fibonacci nword number you want to see:"
"(f(x), f(0) is the starting element.):\n");
scanf("%d",&x);
printf("Required Word is:\n");
printf("~~%s\n", fib(x));
return 0;
}