Alguem me explica pq é que o programa me come uma letra?

[N]

Power Member
saudações. fiz este exercicio para uma cadeira:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

// primeiro record que suporta 3 infos sobre um livro
typedef struct {
char Titulo [201];
char Autor[101];
char Editor [101];
} *TLivro;

// segundo record que alberga o ISBN de um livro e aponta para mais informacao sobre o livro [ISBN,ptr_TLivro]
typedef struct {
char ISBN [11];
TLivro Livro;
} TBiblio;


// F u n c t i o n s . . .

// a d _ l i v r o

TLivro ad_livro (TBiblio *Biblioteca, char *Novo_Titulo, char *Novo_Autor, char *Novo_Editor)
{
TLivro Livro;

Livro = malloc (sizeof (TLivro)); // alocacao de memoria para o novo livro
if (Livro == 0)
{
printf ("\n * * * * * * * * * * * * * ");
printf ("\n * * ");
printf ("\n * No RAM for you... * ");
printf ("\n * * ");
printf ("\n * * * * * * * * * * * * * ");
}

strcpy (Livro->Titulo,Novo_Titulo);
strcpy (Livro->Autor,Novo_Autor);
strcpy (Livro->Editor,Novo_Editor);


return (Livro);
}


// m o s t r a

void mostra (TBiblio *Biblioteca , int Num_Livros)
{
int i;

for (i = 0 ; i < Num_Livros ; i++)
{
printf ("\n\n Livro #%d ", i+1);
printf ("\n \t ISBN: %s", Biblioteca.ISBN);
printf ("\n \t Titulo: %s", Biblioteca.Livro->Titulo);
printf ("\n \t Autor: %s", Biblioteca.Livro->Autor);
printf ("\n \t Editor: %s", Biblioteca.Livro->Editor);
}
}


// L e r L i s t a L i v r o s

// funcao que le a info sobre um determinado numero (Num_Livros) de livros

void LerListaLivros (TBiblio *Biblioteca, int Num_Livros)
{
int i;

char ISBN [11], Titulo [201], Autor [101], Editor [201];

for (i = 0 ; i < Num_Livros ; i++)
{
printf("\n -> Livro #%d", i+1);

printf("\n \t ISBN? "); getchar();
fgets (ISBN, 11, stdin);

printf("\n \t Titulo? "); getchar();
fgets (Titulo, 201, stdin);

printf("\n \t Autor? "); getchar();
fgets (Autor, 101, stdin);

printf("\n \t Editor? "); getchar();
fgets (Editor, 201, stdin);

strcpy(Biblioteca.ISBN,ISBN);

Biblioteca.Livro = ad_livro (Biblioteca, Titulo, Autor, Editor);
}

mostra(Biblioteca, Num_Livros);
}


// T h e m o t h e r : * * M A I N * *

int main ()
{
int Num_Livros; // variavel que alberga o numero de livros a adiconar

//struct rec *p;
//p=(struct rec *) malloc (sizeof(struct rec));


TBiblio *Biblioteca = NULL; // variavel do tipo TBiblio que aponta para uma variavel do tipo TBiblio.
//aponta para o sitio/posicao onde esta o livro.

Biblioteca = (TBiblio *) malloc(sizeof(TBiblio)); // alocar memoria (podia ter sido feito em cima)
if (Biblioteca == 0)
{
printf ("\n * * * * * * * * * * * * * ");
printf ("\n * * ");
printf ("\n * No RAM for you... * ");
printf ("\n * * ");
printf ("\n * * * * * * * * * * * * * ");
}


printf ("\n -> Quantos livros pretende adicionar? ");
scanf ("%d", &Num_Livros);

if ((Num_Livros > 0) && (Num_Livros < 9999))
{
printf ("\n -> Pretende adicionar %d livro(s)... ", Num_Livros);

LerListaLivros (Biblioteca, Num_Livros);
}

printf ("\n -> Ate a proxima!! \n\n");

return (0);
}


// E n d O f C o d e


no entanto come me a primeira letra que introduzo no titulo autor e editor.
Agradeço desde já a quem ajudar =)
 
[N] disse:
saudações. fiz este exercicio para uma cadeira:



no entanto come me a primeira letra que introduzo no titulo autor e editor.
Agradeço desde já a quem ajudar =)


Experimeta fazer uns "flush"'s em vez dos getchar. Isso pode estar a comer com enters ou algo assim do género. Aliás, eu até aposto que são esses getchar que te estão a comer as primeiras letras... O fgets não te deixa nada para fazeres flush. substitui o getchar por flush e vê lá se não funciona.


Hugs.


EDIT: eu tinha razão! ;) Sem os getchar já funciona. Quanto muito só precisarias do primeiro getchar() uma vez que tens um scanf vindo da função main, que te deixa em espera um /n do enter ao inserir um número. Eu para evitar estas situções nunca trabalho com scanf, mas com fgets e depois converto para int através de funções minhas.

EDIT2: para te resolver já o problema: tira todos os getchar e no lugar o primeiro getchar mete
Código:
fflush(stdin);
 
Última edição:
Back
Topo