Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com vetor dinamico com struct


fgeissler

Pergunta

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á.

Editado por fgeissler
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...