Luthien 0 Denunciar post Postado Setembro 4, 2014 O programa roda bem até a hora de imprimir as informações do livro, ele imprime o título e para. O que poderia ser? #include <stdio.h> typedef struct livros { int ISBN; char *titulo; char editora; char local_pub; char data_pub; char primeiro_autor; char segundo_autor; } TLivros; int main() { int i; TLivros vet[10]; TLivros *p; p = (TLivros*)malloc(5*sizeof(TLivros)); for(i=1; i<=2; i++) { printf("\nInforme a data de publicacao do livro %d no formato dd/mm/aa: ",i); fflush(stdin); scanf("%s", &vet[i].data_pub); } for(i=1; i<=2; i++) { printf("\nInforme a data de publicacao do livro %d no formato dd/mm/aa: ",i); fflush(stdin); scanf("%s", &p->data_pub); } for(i=1; i<=2; i++) { vet[i].titulo = (char*)malloc(20*sizeof(char)); } for(i=1; i<=2; i++) { printf("\nInforme o titulo do livro %d: ",i); fflush(stdin); fgets(vet[i].titulo,20,stdin); } printf("-------------------LIVROS-------------------"); for(i=1; i<=2; i++) { printf("\nTitulo do livro %d: %s",i,vet[i].titulo); printf("\nData de publicacao do livro %d: %s",i,vet[i].data_pub); printf("\nData de publicacaodo livro %d: %s",i,p->data_pub); } for(i=1;i<=2;i++) { free(vet[i].data_pub); free(vet[i].titulo); } return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Setembro 4, 2014 Não use fflush(stdin). Veja no tópico em destaque. Índice começam do zero e vão até N-1. Compartilhar este post Link para o post Compartilhar em outros sites
Luthien 0 Denunciar post Postado Setembro 5, 2014 Meu professor ensinou usar o fflush(stdin) mesmo shuahsuahsa, mas mudei e o erro continua... o programa imprime "-------------------LIVROS-------------------" e para de responder em seguida. Cismo que é alguma coisa com o ponteiro, vou colocar o enunciado aqui, talvez eu tenha interpretado errado: Uma biblioteca precisa realizar o registro do empréstimo dos livros, para isso precisa de um sistema que armazene os seguintes dados: ISBN (código do livro), título do livro, editora, local de publicação, data de publicação, primeiro e segundo autor. Diante das informações apresentadas, crie uma estrutura para esses dados utilizando structs e typedef (recursos da linguagem C). Depois de criar a estrutura, declare: (a) um vetor que seja do tipo dessa estrutura e que armazene 10 (dez) livros. (b) as linhas de instruções para realizar a leitura do campo referente à data de publicação para cada um dos elementos do vetor. © declare um ponteiro do tipo desse estrutura e faça alocação de memória para 5 células de memória utilizando a função malloc. (d) escreva a linha de instrução que realiza a leitura do campo referente à data de publi- cação por meio do ponteiro declarado em © utilizando o operador seta. (e) faça uma alteração em sua estrutura de forma que o campo que armazena o título do livro seja um ponteiro para char e escreva a linha de instrução que realiza a leitura do campo (lembre-se que você está trabalhando com um campo que é um ponteiro e antes de utilizá-lo deve inicializá-lo). #include <stdio.h> typedef struct livros { int ISBN; char *titulo; char editora; char local_pub; char data_pub; char primeiro_autor; char segundo_autor; } TLivros; int main() { int i; TLivros vet[10]; TLivros *p; p = (TLivros*)malloc(5*sizeof(TLivros)); for(i=0; i<=9; i++) { printf("\nInforme a data de publicacao do livro %d no formato dd/mm/aa: ",i+1); scanf("%s%*c", &vet[i].data_pub); } for(i=0; i<=9; i++) { printf("\nInforme a data de publicacao do livro %d no formato dd/mm/aa: ",i+1); scanf("%s%*c", &p->data_pub); } for(i=0; i<=9; i++) { vet[i].titulo = (char*)malloc(20*sizeof(char)); } for(i=0; i<=9; i++) { printf("\nInforme o titulo do livro %d: ",i+1); scanf("%s%*c", &vet[i].titulo); } printf("-------------------LIVROS-------------------"); for(i=0; i<=9; i++) { printf("\nTitulo do livro %d: %s", i+1, vet[i].titulo); printf("\nData de publicacao do livro %d: %s", i+1, vet[i].data_pub); printf("\nData de publicacaodo livro %d: %s", i+1, p->data_pub); } for(i=0;i<=9;i++) { free(vet[i].data_pub); free(vet[i].titulo); } return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
ScreenBlack 13 Denunciar post Postado Setembro 6, 2014 1) Você está declarando na struct, variáveis do tipo char, ou seja, permitem armazenar apenas um carácter. Defina-as como vetor ou, então, como ponteiro de char (assim como fez na variável 'titulo') e depois aloque espaço para elas. Exemplo: typedef struct { int ISBN; char titulo[20]; char editora[20]; char local_pub[20]; char data_pub[20]; char primeiro_autor[20]; char segundo_autor[20]; } TLivros; 2) Não faça typecast em retorno da função malloc(). O compilador se torna forçado a reconhecer os tipos, evitando que seja mostrado possíveis erros para as comparações. 3) A variável p tornou-se um vetor de 5 posições do tipo TLivros, portanto, precisa alocar memória para o índice (apesar de funcionar sem), também. TLivros vet[10]; TLivros **p; /* Alocação de memória */ p = malloc( sizeof(TLivros *) * 5 ); /* Aloca 5 índices para o vetor "TLivros" */ for ( i = 0; i < 5; i++ ) p[i] = malloc( sizeof(TLivros) ); /* Liberação de memória */ for ( i = 0; i < 5; i++ ) free(p[i]); /* Conteúdo das estruturas */ free(p); /* Alocação do índice */ Compartilhar este post Link para o post Compartilhar em outros sites
Luthien 0 Denunciar post Postado Setembro 6, 2014 Tenho mesmo q usar ponteiro de ponteiro? Isso buga meu cerebro D: Olha se entendi direito oq o prof qr: vou armazenar a data de publicação de 10 livros no vetor, e depois armazenar a data de 5 livros no espaço q aloquei na memoria? E eu nunca devo usar o typecast? Só mais uma coisa... usar p = malloc( sizeof(TLivros *) * 5 ) é a mesma coisa q usar p = malloc(5*sizeof(TLivros*)) ? Compartilhar este post Link para o post Compartilhar em outros sites
ScreenBlack 13 Denunciar post Postado Setembro 6, 2014 1) O uso de: p = malloc( sizeof(TLivros *) * 5 ) Você está alocando 5 estruturas para apenas um ponteiro.A idéia de alocar os ponteiros, é para existir um ponteiro para cada estrutura alocada, ou seja, montar o vetor de ponteiros: p[i] 2)O adequado é nunca usar, ou então, em casos muito específicos, o que não ocorre aqui. 3) Sim, é a mesma coisa. A ordem da multiplicação não altera o resultado. Apenas coloquei no final, por hábito e também, porque é comumente usado assim. Compartilhar este post Link para o post Compartilhar em outros sites
Luthien 0 Denunciar post Postado Setembro 6, 2014 aaah entendi, obrigada! :) Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Setembro 6, 2014 Meu professor ensinou usar o fflush(stdin) mesmo Clássico. Ensinando vícios de programação. Compartilhar este post Link para o post Compartilhar em outros sites