为什么我没有得到想要的输出?

时间:2019-06-12 05:48:06

标签: c string

问题是写出要求的斐波那契单词。例如,如果输入为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);
    }
}

2 个答案:

答案 0 :(得分:1)

首先回答主要问题,例如“为什么我没有得到想要的输出”:

因为您不知道自己在做什么。

您要静态声明3个char []变量,将它们分配给char *类型的指针,甚至不能正确使用它们。

让我们分析一下代码的一部分:

for(i=0;i<n-1;i++)
{
    *r = *q;
    strcat(str2,str1);
    *p = *r;
}

您正在做的基本上是:

  • 分配str3 [0] ='b'(在* r = * q中)
  • 将str1的内容复制到str2中,因此在第一次运行中将“ ba”复制到
  • 分配str1 [0] ='b'(在* p = * r中)
  • 然后,将“ b”重复连接到str2中,因为从现在开始,两个str1仅包含一个“ b”。

这样做,对于高于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;
}