Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

Programa para de executar, ponteiros, structs e vetores

Recommended Posts

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

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

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

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

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

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

 

 

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.