Vector in struct does not work

Asked

Viewed 41 times

0

Good night! I’m trying to store some variables in a struct with a .dat. My goal is to take each line of this file and store it in a vector position of the struct. The Qtd and the track are working, but the old words[3][17] that should store up to 3 values is giving error. Follow the code:

#include <stdio.h>
#include <stdlib.h> // exit
#include <string.h>

typedef struct
{
    char pista[17];
    int qtd;
    char vetpalavras[3][17];
} Jogo;

Jogo jogo[5];

int main(void)
{   

  int qtd, i,j;
  char url[] = "palavras.dat", pista[17], vetpalavras[3][17];
  printf("*\n");

  FILE *arq = fopen(url, "r");
  if (arq == NULL)
  {
    printf("* erro, nao foi possivel abrir o arquivo\n");
    printf("*\n");
    exit(1);
  }

  for (j = 0; j < 5; j++)
  {
    // primeiro faz a leitura do nome e da quantidade de palavras
    if (fscanf(arq,"%16s %d", pista, &qtd) != 2)
    {
      // nao conseguiu ler os 2 campos

      // e' fim de arquivo ?
      if (feof(arq)) {
        printf("* ok, fim de arquivo\n");

      }  else
        printf("* erro no conteudo do arquivo\n");

      printf("*");
      exit(0);
    }

    // neste ponto leu o nome e a quantidade de palavras

    // agora vai ler as palavras

    if (qtd > 3)
      qtd = 3;

    for (i = 0; i < qtd; i++)
    {
      if (fscanf(arq, "%16s", vetpalavras[i]) != 1)
      {
        printf("* erro no conteudo do arquivo\n");
        printf("*\n");
        exit(2);
      }
    }

    // ok, leu as palavras

    printf("* nome=%-10s qtd=%d", pista, qtd);

    for (i = 0; i < qtd; i++)
      printf(" %s", vetpalavras[i]);

    strcpy(jogo[j].vetpalavras[i], vetpalavras[i]);
    jogo[j].qtd=qtd;
    strcpy(jogo[j].pista, pista);

    printf("\n\nTeste:\n quantidade: %d\n pista: %s\n palavras:%s\n\n", jogo[j].qtd,jogo[j].pista,jogo[j].vetpalavras[i]);
    printf("\n");
  }

  fclose(arq);
}

How can I fix this?

word file.dat:

Vegetal 2 ACELGA ALFACE
Automovel 3 MOTOR EMBREAGEM ESCAPAMENTO
Cozinha 3 PRATO PANELA FOGAO
Reptil 1 JARARACA
Mamifero 2 BALEIA MACACO

Exit:

* nome=Vegetal    qtd=2 ACELGA ALFACE

Teste:
 quantidade: 2
 pista: Vegetal
 palavras:


* nome=Automovel  qtd=3 MOTOR EMBREAGEM ESCAPAMENTO

Teste:
 quantidade: 3
 pista: Automovel
 palavras:


* nome=Cozinha    qtd=3 PRATO PANELA FOGAO

Teste:
 quantidade: 3
 pista: Cozinha
 palavras:


* nome=Reptil     qtd=1 JARARACA

Teste:
 quantidade: 1
 pista: Reptil
 palavras:PANELA


* nome=Mamifero   qtd=2 BALEIA MACACO

Teste:
 quantidade: 2
 pista: Mamifero
 palavras:FOGAO
  • In C we use the strcpy function to copy strings and not the assignment with =.

  • Note that after the comment"//ok, read the words" you use the variable j as index but the content of this variable is 5, the value you left the previous loop you used it with.

1 answer

0


You will use the variable "game" (array of game structures) to work, and no longer the individual variables "track" and "vetpalavras".

Obs.: not tested.

#include <stdio.h>
#include <stdlib.h> // exit
#include <string.h>

typedef struct
{
    char pista[17];
    int qtd;
    char vetpalavras[3][17];
} Jogo;

Jogo jogo[5];

int main(void)
{
  int qtd, i, j;
  char url[] = "palavras.dat"; // , pista[17], vetpalavras[3][17];

  printf("*\n");

  FILE *arq = fopen(url, "r");
  if (arq == NULL)
  {
    printf("* erro, nao foi possivel abrir o arquivo\n");
    printf("*\n");
    exit(1);
  }

  for (j = 0; j < 5; j++)
  {
    // primeiro faz a leitura do nome e da quantidade de palavras
    if (fscanf(arq,"%16s %d", jogo[j].pista, &jogo[i].qtd) != 2)
    {
      // nao conseguiu ler os 2 campos

      // e' fim de arquivo ?
      if (feof(arq)) {
        printf("* ok, fim de arquivo\n");

      }  else
        printf("* erro no conteudo do arquivo\n");

      printf("*");
      exit(0);
    }

    // neste ponto leu o nome e a quantidade de palavras

    // agora vai ler as palavras

    if (jogo[j].qtd > 3)
      jog[j].qtd = 3;

    for (i = 0; i < jogo[j].qtd; i++)
    {
      if (fscanf(arq, "%16s", jogo[j].vetpalavras[i]) != 1)
      {
        printf("* erro no conteudo do arquivo\n");
        printf("*\n");
        exit(2);
      }
    }

    // ok, leu as palavras

    printf("* nome=%-10s qtd=%d", jogo[j].pista, jogo[j].qtd);

    for (i = 0; i < jogo[j].qtd; i++)
      printf(" %s", jogo[j].vetpalavras[i]);

    printf("\n\nTeste:\n quantidade: %d\n pista: %s\n palavras:%s\n\n", jogo[j].qtd,jogo[j].pista,jogo[j].vetpalavras[i]);
    printf("\n");
  }

  fclose(arq);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.