Line break when typing entries

2

I have a vector of structs with 10 people and I want my registration function to receive only one person at a time.
At the terminal, the first person's registration is done correctly but after I get this "break" line, it jumps alone from the name I would type for age. Why does this occur?

[danielamorais@localhost Desktop]$ ./ex3
Digite o nome:
Daniela
Digite a idade:
18
Digite o nome:
Digite a idade:

Code

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


#define TAM 10

typedef struct{
char nome[30];
int idade;
} Pessoa;

void cadastrarPessoa(Pessoa *pessoa){
        puts("Digite o nome:");
        gets((*pessoa).nome);
        puts("Digite a idade:");
        scanf("%d", &((*pessoa).idade));
}

void lerPessoas(Pessoa *p){
    for(int i = 0; i < TAM; i++){
        cadastrarPessoa(&p[i]);
    }
}

void imprimirVetor(Pessoa *p){
    for(int i = 0; i < TAM; i++){
        printf("Nome: %s", p[i].nome);
        printf("Idade: %d", p[i].idade);
    }
}

void main(){
    Pessoa *pessoa = (Pessoa *)malloc(sizeof(Pessoa) * TAM);
    lerPessoas(pessoa);
    imprimirVetor(pessoa);
}
    
asked by anonymous 22.12.2015 / 14:55

1 answer

3

To correct the problem of skipping line it is necessary to clean the keyboard buffer with __fpurge that is left by scanf , see how the modifications were made:

void cadastrarPessoa(Pessoa *pessoa){
        puts("Digite o nome:");
        gets((*pessoa).nome);
        puts("Digite a idade:");
        scanf("%d", &((*pessoa).idade));
        __fpurge(stdin);/*<-------Mudei aqui*/
}

I also need to declare the stdio_ext.h library to use __fpurge , I suggest changing gets to fgets , because gets is vulnerable to bufferoverflow.

The i is not declared within for , has to be left out, see:

int i;
for (i = 0; i < 10; i++){faz algo....}
    
22.12.2015 / 15:03