Jump to content
Fórum Script Brasil
  • 0

Ajuda com vetor dinamico com struct


fgeissler

Question

Olá pessoal!

Estou iniciando no C++ e gostaria de uma luz.

Estou tetando fazer um vetor dinamico de struct, e nesse struct eu tenho 3 chars. E eu tenho que ler os dados e exibir eles logo em seguinda, só que o output sai todo errado.

Eu não sei se o erro está no modo como estou lendo os dados ou no modo que estou exibindo eles.

Aqui está parte do codigo que interessa.

struct agenda
{
       char horario[10];
       char data[10];
       char compromisso[50];
}; 

int main ()
{
    struct agenda *ptr;
    int i, tam = 2;    
    
    ptr = (struct agenda*) malloc(sizeof(struct agenda*)*tam);
    
    for ( i = 0; i < tam; i++)
    {
        
         printf("\n Digite o horario do compromisso no formato HH:MM:SS: ");
        gets(ptr.horario);
        fflush(stdin);
        printf("\n Digite a data do compromisso no formato DD/MM/YYYY: ");
        gets(ptr.data);
        fflush(stdin);
        printf("\n Digite qual o compromisso: ");
        gets(ptr.compromisso);
        fflush(stdin);
        
    }
    
    printf("\n ----------------------------");   
    
    for ( i = 0; i < tam; i++)
    {
        printf("\n Compromisso %d" , i+1);
        printf("\n");
        printf("\n Horario: %s", ptr.horario);
        fflush(stdin);
        printf("\n Data: %s", ptr.data);
        fflush(stdin);
        printf("\n Compromisso: %s", ptr.compromisso);
        fflush(stdin);
        printf("\n ----------------------------");    
    }

Abaixo está o output:


 Digite o horario do compromisso no formato HH:MM:SS: 10:00:00

 Digite a data do compromisso no formato DD/MM/YYYY: 13/09/2016

 Digite qual o compromisso: Consulta medica.

 Digite o horario do compromisso no formato HH:MM:SS: 14:00:00

 Digite a data do compromisso no formato DD/MM/YYYY: 10/10/2016

 Digite qual o compromisso: Levar cachorro no veterinario.

 ----------------------------
 Compromisso 1

 Horario: 10:00:00
 Data: 13/09/2016Consulta medica.
 Compromisso: Consulta medica.
 ----------------------------
 Compromisso 2

 Horario: 14:00:00
 Data: 10/10/2016Levar cachorro
 Data: 10/10/2016Levar cachorro
 Data: 10/10/2016Levar
 Compromisso: Levar cachorro
 Compromisso: Levar cachorro
 Compromisso: Levar cachorro
 Compromisso: Levar cachorro
 ----------------------------
Press any key to continue . . .

 

Será que alguém poderia me dar uma luz ? Já tentei ler os dados usando scanf tb mais o resultado é o mesmo.

 

Muito obrigado.

 

 

edit: por algum motivo não está salvando o indice ( ) na variaveis aqui no forum, mais ele está lá.

Edited by fgeissler
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

quando você declara ptr = (struct agenda*) malloc(sizeof(struct agenda*)*tam); imagine que tam vale 3, nesse caso seria igual a ptr = (struct agenda*) malloc(sizeof(struct agenda*)*3), isso é um array de structs, sizeof(struct agenda*)*3 diz que você está  usando malloc para reservar 3 espaços do tamanho da estrutura agenda, isso quer dizer que você tem 3 agendas e não uma como você ta tentando ler com o comando gets(ptr.horario), você precisa ter claro que você tem ptr[0] que é agenda 1, ptr[1] que é agenda 2 e prt[3] que é agenda 3, são 3 agendas e cada uma delas tem 3 strings(Não chars) dentro, e você pode ler com gets(ptr[0].horario), nesse caso você leu o horario da primeira agenda, mas tem 2 mais no nosso hipotético caso, ou seja que podemos ler a hora para ptr[1].horario e ptr[2].horario, também podemos ler data e compromiso para cada uma das 3 agendas. Então você precisa primeiro indicar qual das agendas que você quer editar(ptr[0], ptr[1], ptr[2]...) e depois por um ponto e seguido do ponto a variável que você quer editar, se queremos editar a primeira agenda eu selecionamos ptr[0] + a .variável, isso fica ptr[0].variavel. Esse é o erro que você está tendo(tratar um array de structs como se fosse um único struct), se quiser uma só estrutura então use ptr = (struct agenda*) malloc(sizeof(struct agenda*)).

Link to comment
Share on other sites

  • 0
20 horas atrás, vangodp disse:

quando você declara ptr = (struct agenda*) malloc(sizeof(struct agenda*)*tam); imagine que tam vale 3, nesse caso seria igual a ptr = (struct agenda*) malloc(sizeof(struct agenda*)*3), isso é um array de structs, sizeof(struct agenda*)*3 diz que você está  usando malloc para reservar 3 espaços do tamanho da estrutura agenda, isso quer dizer que você tem 3 agendas e não uma como você ta tentando ler com o comando gets(ptr.horario), você precisa ter claro que você tem ptr[0] que é agenda 1, ptr[1] que é agenda 2 e prt[3] que é agenda 3, são 3 agendas e cada uma delas tem 3 strings(Não chars) dentro, e você pode ler com gets(ptr[0].horario), nesse caso você leu o horario da primeira agenda, mas tem 2 mais no nosso hipotético caso, ou seja que podemos ler a hora para ptr[1].horario e ptr[2].horario, também podemos ler data e compromiso para cada uma das 3 agendas. Então você precisa primeiro indicar qual das agendas que você quer editar(ptr[0], ptr[1], ptr[2]...) e depois por um ponto e seguido do ponto a variável que você quer editar, se queremos editar a primeira agenda eu selecionamos ptr[0] + a .variável, isso fica ptr[0].variavel. Esse é o erro que você está tendo(tratar um array de structs como se fosse um único struct), se quiser uma só estrutura então use ptr = (struct agenda*) malloc(sizeof(struct agenda*)).

Opa! Cara me desculpe se não coloquei isso antes, na realidade o que eu tenho que fazer é fazer três cadastros, por isso eu estou multiplicando por 3.

se por exemplo, eu colocar só a letra "a" em todos os três campos na primeira vez, só a letra "b" na segunda interação e a letra "c" em todos os três campos na terceira, funciona tudo direitinho e o output sai correto, agora se eu tentar preencher os campos mesmo, ainda mais se tiver espaço na string, quebra e o output fica do jeito que eu mandei aí. Será que o problema não é na forma que estou salvando os dados?

Link to comment
Share on other sites

  • 0
#include <stdio.h>
#include <stdlib.h>

struct agenda {
    char horario[10];
    char data[10];
    char compromisso[50];
};

int main () {
    struct agenda *ptr;
    int i, tam = 2;
    
    ptr = ( struct agenda* ) malloc ( sizeof ( struct agenda* ) *tam );
    
    for ( i = 0; i < tam; i++ ) {
    
        printf ( "\n Digite o horario do compromisso no formato HH:MM:SS: " );
        gets ( ptr[i].horario );
        fflush ( stdin );
        printf ( "\n Digite a data do compromisso no formato DD/MM/YYYY: " );
        gets ( ptr[i].data );
        fflush ( stdin );
        printf ( "\n Digite qual o compromisso: " );
        gets ( ptr[i].compromisso );
        fflush ( stdin );
        
    }
    
    printf ( "\n ----------------------------" );
    
    for ( i = 0; i < tam; i++ ) {
        printf ( "\n Compromisso %d", i + 1 );
        printf ( "\n" );
        printf ( "\n Horario: %s", ptr[i].horario );
        fflush ( stdin );
        printf ( "\n Data: %s", ptr[i].data );
        fflush ( stdin );
        printf ( "\n Compromisso: %s", ptr[i].compromisso );
        fflush ( stdin );
        printf ( "\n ----------------------------" );
    }
    
    free(ptr);
    return 0;
}

Volte a ler tudo o que eu escrevi e analise seu código. Se eu te explicar o erro que você tem e você não prestar atenção ou achar que falo tonterias fica difícil chegar a uma compreensão do problema. você precisa primeiro acessar ao objeto ptr[X] e depois acessar suas variáveis membros, tanto na leitura como na escritura. Sorte

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      651.8k
×
×
  • Create New...