Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas com struct


tek6

Pergunta

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 para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...