Почему я не получаю желаемый результат? - PullRequest
0 голосов
/ 12 июня 2019

Проблема в том, чтобы написать слово Фибоначчи.Например, если input равен 0, то f (0) = a, если 1, f (1) = b и аналогично f (2) = ba, f (3) = bab, f (4) = babba и так далее.Я написал следующий код, чтобы найти вывод на терминале Ubuntu 18.04 LTS.Я получаю правильный вывод для n = 0,1,2,3.Но для n = 4 я получаю babb вместо 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 ]

1 голос
/ 12 июня 2019

Ваш код запутан. Я изменил это так:

#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;
}
1 голос
/ 12 июня 2019

Сначала отвечая на главный вопрос: «Почему я не получаю желаемый результат»:

Поскольку вы не знаете, что делаете.

Вы заявляете3 переменные char [] статически, назначая их указателям типа char *, и даже не используя их правильно.

Давайте проанализируем часть вашего кода:

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

Что выв основном это:

  • назначить str3 [0] = 'b' (in * r = * q)
  • скопировать содержимое str1 в str2, поэтому "ba" впервый прогон
  • assign str1 [0] = 'b' (in * p = * r)
  • А затем, многократно объединить "b" в str2, потому что оба str1 будут содержать толькоодиночный "b" на данный момент.

Делая это, для чего-либо выше 4, вы получите только "babbbbbbbbbb" ...

Мой совет: если вы собираетесьчтобы статически объявить некоторые переменные, прекратите использовать указатели для доступа к ним.Попробуйте получить доступ к str1 / str2 как к векторам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...