Jump to content
Fórum Script Brasil
  • 0

Problemas com struct


tek6
 Share

Question

Olá pessoal! Não entendo o problema desse código. O problema está na hora q eu vo ler o segundo registro, por exemplo:

emp[1].nome
elá passa direto para o campo dataNasc. Como pode ver usei o
fflush(stdin);
mas não resolveu meu problema. Estou copilando pelo gcc.
#include <stdio.h>
#include <stdlib.h>

struct cadastro {
    char nome[20];
    int dataNasc[3];
    int salario;
};

int main(void) {
    struct cadastro emp[3];
    int i; //Contador
        
        // Ler dados para a strcut
    for (i = 0; i < 3; i++) {
        printf ("Digite o nome: ");
        fflush(stdin);
        gets(emp[i].nome);

        printf ("Digite a data de nascimento: ");
        scanf ("%d/%d/%d", &emp[i].dataNasc[0], &emp[i].dataNasc[1], &emp[i].dataNasc[2]);

        printf ("Digite o seu salário: ");
        scanf ("%d", &emp[i].salario);
    }

        // Escreve o que foi lido
    for (i = 0; i < 3; i++) {
        printf ("%s\n", emp[i].nome);
        printf ("%0d/%0d/%0d\n", emp[i].dataNasc[0], emp[i].dataNasc[1], emp[i].dataNasc[2]);
        printf ("%d\n\n", emp[i].salario);
    }

    return 0;
}

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Olá!

Uma coisa que nunca devia ser feita e que é muito comum de se ver é o código:

fflush(stdin);
Isso é errado! A função fflush é definida apenas para streams de saída! O uso em streams de entrada é imprevisível. Assim pode até funcionar em alguns ambientes mas nada garante isso. Uma alternativa é sempre usar o fgets para ler o buffer e então usar o sscanf para varrer o buffer lido. Para limpar o buffer de teclado pode-se usar:
__fpurge(stdin);
Isso funciona no Linux/BSD/MacOSX. Para windows eu não tenho certeza o que é o correto. Outra coisa que deve ser evitada é o uso do gets. Como ele não tem controle sobre a quantidade de dados que serão lidos, é muito fácil de gerar estouro no buffer. Para resolver esse problema, use sempre fgets no lugar de gets. Veja o seu código abaixo com a minha solução. Eu criei uma função que usa a fgets para ler o buffer e excluir os espaços e quebras do final. Em seguida você pode usar o sscanf para ler o valor:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 1024

struct cadastro {
    char nome[20];
    int dataNasc[3];
    int salario;
};

char * ReadStdIn(char *destino, int size)
{
    int i;
    char buffer[BUFFER_SIZE];

    fgets(buffer, BUFFER_SIZE, stdin);
    for(i = strlen(buffer)-1; i >= 0; i--) {
        switch(buffer[i]) {
            case '\r':
            case '\n':
            case ' ':
                buffer[i] = 0;
        default: // Terminou. Devemos interroper o loop
            i = 0;
        }
    }

    if(destino != NULL && size > 0) {
        strncpy(destino, buffer, size-1);
        destino[size-1] = 0;
    }

    return destino;
}

int main(void) {
    char inbuff[BUFFER_SIZE];
    struct cadastro emp[3];
    int i; //Contador
        
        // Ler dados para a strcut
    for (i = 0; i < 3; i++) {
        printf ("Digite o nome: ");
        ReadStdIn(emp[i].nome, sizeof(emp[i].nome));

        printf ("Digite a data de nascimento: ");
        ReadStdIn(inbuff, BUFFER_SIZE);
        sscanf (inbuff, "%d/%d/%d", &emp[i].dataNasc[0], &emp[i].dataNasc[1], &emp[i].dataNasc[2]);

        printf ("Digite o seu salário: ");
        ReadStdIn(inbuff, BUFFER_SIZE);
        sscanf (inbuff, "%d", &emp[i].salario);
    }

        // Escreve o que foi lido
    for (i = 0; i < 3; i++) {
        printf ("%s\n", emp[i].nome);
        printf ("%0d/%0d/%0d\n", emp[i].dataNasc[0], emp[i].dataNasc[1], emp[i].dataNasc[2]);
        printf ("%d\n\n", emp[i].salario);
    }

    return 0;
}

Qualquer dúvida é só avisar! :)

Abraços,

Marcelo Utikawa da Fonseca

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.4k
×
×
  • Create New...