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

(Resolvido) Problemas com gets


Anderson G.

Pergunta

Boa tarde developers !!!!

Eu com meu total amadorismo, estou aqui novamente para recorrer a com manja de verdade.

Tenho uma atividade da facul que diz o seguinte:

/*

* 4) Cadastrar e imprimir os dados de vários professores de um sistema de administração escolar:

* Nomes,Endereço, Cidade, CEP, Telefone, CPF e data de nascimento e qual curso em que se formou

*/

Até aí beleza ... resolvi usar o struct para fazer o cadastro .... como eu não sabia utilizar o struct, resolvi aprender a utilizá-lo antes de avançar no exercício e até que não tive muitos problemas, até chegar no último gets que não permite a inserção de dados pulando direto pros printf abaixo.

Resolvi usar o gets para poder ler espaços na variável.

Meu sistema operacional é o Debian e uso IDE Netbeans.

SEGUE ABAIXO O CÓDIGO.

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

/*
 * 
 */

struct cadastro
{
    char nome [30];
    char endereco [30];
    char cidade [30];
    int cep;
    int telefone;
    char cpf [14];
    char dtnasc [10];
    char curso_form [30];
};

main() {

        struct cadastro cad_professores;

            printf ("Nome: ");
            gets (cad_professores.nome);
            printf ("Endereço: ");
            gets(cad_professores.endereco);
            printf ("Cidade: ");
            gets (cad_professores.cidade);
            printf ("CEP: ");
            scanf ("%d", &cad_professores.cep);
            printf ("Telefone: ");
            scanf ("%d", &cad_professores.telefone);
            printf ("CPF: ");
            scanf ("%s", cad_professores.cpf);
            printf ("Data de nascimento: ");
            scanf ("%s", cad_professores.dtnasc);
            printf ("Curso de Formação: ");
            gets (cad_professores.curso_form);

    printf ("\n\n\n");
    
                printf ("\n Nome: %s", cad_professores.nome);
                printf ("\n Endereço: %s", cad_professores.endereco);
                printf ("\n Cidade: %s", cad_professores.cidade);
                printf ("\n CEP: %d", cad_professores.cep);
                printf ("\n Telefone: %d", cad_professores.telefone);
                printf ("\n CPF: %s", cad_professores.cpf);
                printf ("\n Data de nascimento: %s", cad_professores.dtnasc);
                printf ("\n Curso de Formação: %s \n\n", cad_professores.curso_form);

    return (EXIT_SUCCESS);
}
Abaixo segue as maneiras que tentei corrigir e todos me retornaram o mesmo resultado.
scanf ("%s", cad_professores.curso_form);

gets (cad_professores.curso_form);

#include <iostream>
  using namespace std;
      cin.getline (cad_professores.curso_form, 30);

fflush (stdin); // antes de cada gets e scanf

NÃO QUERO A SOLUÇÃO DO EXERCÍCIO, QUERO SOMENTE APRENDER COMO RESOLVER ESSE PROBLEMA DO GETS ... PARA RESOLVER O EXERCÍCIO TENHO QUE QUEBRAR A CABEÇA MAIS UM POUQUINHO .... EMBORA APARENTA SER FÁCIL.

Me socorram .....

valeu !!!

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Você deve colocar um getchar() depois de cada scanf().

printf ("Data de nascimento: ");
scanf ("%s", cad_professores.dtnasc);
getchar();
printf ("Curso de Formação: ");
gets (cad_professores.curso_form);
Para ler uma string com espaços usando scanf():
scanf("%[^\n]",s);

Editado por ml126
Link para o comentário
Compartilhar em outros sites

  • 0
Você deve colocar um getchar() depois de cada scanf().

printf ("Data de nascimento: ");
scanf ("%s", cad_professores.dtnasc);
getchar();
printf ("Curso de Formação: ");
gets (cad_professores.curso_form);
Para ler uma string com espaços usando scanf():
scanf("%[^\n]",s);
Muito obrigado ml126, mas ele deu outro problema. A saída de Curso de Formação ele jogou também em Data de nascimento e CPF. Segue abaixo o resultado: Nome: Fulano da Silva Endereço: Rua dos bobos, 0 Cidade: Fulanópolis CEP: 899000222 Telefone: 22334455 CPF: 222.222.222.2201/01/2012 Ciência da Computação Data de nascimento: 01/01/2012 Ciência da Computação Curso de Formação: Ciência da Computação Pressione [Enter] para fechar o terminal...
#include <stdlib.h>
#include <stdio.h>

/*
 * 
 */

struct cadastro
{
    char nome [30];
    char endereco [30];
    char cidade [30];
    int cep;
    int telefone;
    char cpf [14];
    char dtnasc [10];
    char curso_form [30];
};

main() {

        struct cadastro cad_professores;

            printf ("Nome: ");
            gets (cad_professores.nome);
            printf ("Endereço: ");
            gets(cad_professores.endereco);
            printf ("Cidade: ");
            gets (cad_professores.cidade);
            printf ("CEP: ");
            scanf ("%d", &cad_professores.cep);
            printf ("Telefone: ");
            scanf ("%d", &cad_professores.telefone);
            printf ("CPF: ");
            scanf ("%s", cad_professores.cpf);
            printf ("Data de nascimento: ");
            scanf ("%s", cad_professores.dtnasc);
            getchar ();
            printf ("Curso de Formação: ");
            gets (cad_professores.curso_form);

    printf ("\n\n\n");
    
                printf ("\n Nome: %s", cad_professores.nome);
                printf ("\n Endereço: %s", cad_professores.endereco);
                printf ("\n Cidade: %s", cad_professores.cidade);
                printf ("\n CEP: %d", cad_professores.cep);
                printf ("\n Telefone: %d", cad_professores.telefone);
                printf ("\n CPF: %s", cad_professores.cpf);
                printf ("\n Data de nascimento: %s", cad_professores.dtnasc);
                printf ("\n Curso de Formação: %s \n\n", cad_professores.curso_form);

    return (EXIT_SUCCESS);
}

No código acima o getchar () está somente no ultimo scanf, mas eu também inseri em todos para ver se apresentava erro.

usando o scanf ("%[^\n]",s); também não rolou .....

PRA QUE SERVE O getchar(); ????

Editado por Anderson G.
Link para o comentário
Compartilhar em outros sites

  • 0

Não recomendo o uso do scanf para ler entrada do usuário.

Troquei o scanf("%d", ...); por chamadas a essa função e ficou perfeito: (Ubuntu 10.04)

int ler_inteiro(int *i) {
    char string[1024];
    fgets(string, 1024, stdin);
    *i = atoi(string);
    
    return *i;
}

Também troquei os scanf("%s", ...); por gets. Além disso, recomendaria o uso da fgets ao invés do gets, já que o gets pode causar buffer overrun.

Código:


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

/*
*
*/

int ler_inteiro(int *i) {
char string[1024];
fgets(string, 1024, stdin);
*i = atoi(string);

return *i;
}

struct cadastro
{
char nome [30];
char endereco [30];
char cidade [30];
int cep;
int telefone;
char cpf [14];
char dtnasc [10];
char curso_form [30];
};

main() {

struct cadastro cad_professores;

printf ("Nome: ");
gets (cad_professores.nome);
printf ("Endereço: ");
gets(cad_professores.endereco);
printf ("Cidade: ");
gets (cad_professores.cidade);
printf ("CEP: ");
ler_inteiro(&cad_professores.cep);
printf ("Telefone: ");
ler_inteiro(&cad_professores.telefone);
printf ("CPF: ");
gets(cad_professores.cpf);
printf ("Data de nascimento: ");
gets(cad_professores.dtnasc);
printf ("Curso de Formação: ");
gets (cad_professores.curso_form);

printf ("\n\n\n");

printf ("\n Nome: %s", cad_professores.nome);
printf ("\n Endereço: %s", cad_professores.endereco);
printf ("\n Cidade: %s", cad_professores.cidade);
printf ("\n CEP: %d", cad_professores.cep);
printf ("\n Telefone: %d", cad_professores.telefone);
printf ("\n CPF: %s", cad_professores.cpf);
printf ("\n Data de nascimento: %s", cad_professores.dtnasc);
printf ("\n Curso de Formação: %s \n\n", cad_professores.curso_form);

return (EXIT_SUCCESS);
}
[/codebox]

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0
Não recomendo o uso do scanf para ler entrada do usuário.

Troquei o scanf("%d", ...); por chamadas a essa função e ficou perfeito: (Ubuntu 10.04)

int ler_inteiro(int *i) {
    char string[1024];
    fgets(string, 1024, stdin);
    *i = atoi(string);
    
    return *i;
}
Também troquei os scanf("%s", ...); por gets. Além disso, recomendaria o uso da fgets ao invés do gets, já que o gets pode causar buffer overrun. Código:
#include <stdlib.h>
#include <stdio.h>

/*
* 
*/

int ler_inteiro(int *i) {
    char string[1024];
    fgets(string, 1024, stdin);
    *i = atoi(string);

    return *i;
}

struct cadastro
{
    char nome [30];
    char endereco [30];
    char cidade [30];
    int cep;
    int telefone;
    char cpf [14];
    char dtnasc [10];
    char curso_form [30];
};

main() {

        struct cadastro cad_professores;

            printf ("Nome: ");
            gets (cad_professores.nome);
            printf ("Endereço: ");
            gets(cad_professores.endereco);
            printf ("Cidade: ");
            gets (cad_professores.cidade);
            printf ("CEP: ");
            ler_inteiro(&cad_professores.cep);
            printf ("Telefone: ");
            ler_inteiro(&cad_professores.telefone);
            printf ("CPF: ");
            gets(cad_professores.cpf);
            printf ("Data de nascimento: ");
            gets(cad_professores.dtnasc);
            printf ("Curso de Formação: ");
            gets (cad_professores.curso_form);

    printf ("\n\n\n");

                printf ("\n Nome: %s", cad_professores.nome);
                printf ("\n Endereço: %s", cad_professores.endereco);
                printf ("\n Cidade: %s", cad_professores.cidade);
                printf ("\n CEP: %d", cad_professores.cep);
                printf ("\n Telefone: %d", cad_professores.telefone);
                printf ("\n CPF: %s", cad_professores.cpf);
                printf ("\n Data de nascimento: %s", cad_professores.dtnasc);
                printf ("\n Curso de Formação: %s \n\n", cad_professores.curso_form);

    return (EXIT_SUCCESS);
}
Abraços!
Eu consegui resolver da seguinte maneira: INSERI NO PRIMEIRO scanf ("%[A-Z a-z 0-9]",cad_professores.nome); getchar (); E INSERI TAMBÉM UM getchar () NO ULTIMO SCANF.
struct cadastro cad_professores;

            printf ("Nome: ");
            scanf ("%[A-Z a-z 0-9]",cad_professores.nome);
            getchar ();
            printf ("Endereço: ");
            gets(cad_professores.endereco);
            printf ("Cidade: ");
            gets (cad_professores.cidade);
            printf ("CEP: ");
            scanf ("%d", &cad_professores.cep);
            printf ("Telefone: ");
            scanf ("%d", &cad_professores.telefone);
            printf ("CPF: ");
            scanf ("%s", cad_professores.cpf);
            printf ("Data de nascimento: ");
            scanf ("%s", cad_professores.dtnasc);
            getchar ();
            printf ("Curso de Formação: ");
            gets (cad_professores.curso_form);

AGORA ... QUAL DE TODAS ESSA FORMAS É A MAIS CORRETA DE SE DESENVOLVER ????

ISSO QUE FIZ É GAMBIARRA???

Link para o comentário
Compartilhar em outros sites

  • 0

Você ultrapassou o limite do buffer, por isso que a saida era:

Nome: Fulano da Silva

Endereço: Rua dos bobos, 0

Cidade: Fulanópolis

CEP: 899000222

Telefone: 22334455

CPF: 222.222.222.2201/01/2012 Ciência da Computação

Data de nascimento: 01/01/2012 Ciência da Computação

Curso de Formação: Ciência da Computação

Editado por ml126
Link para o comentário
Compartilhar em outros sites

  • 0
Você ultrapassou o limite do buffer, por isso que a saida era:

Nome: Fulano da Silva

Endereço: Rua dos bobos, 0

Cidade: Fulanópolis

CEP: 899000222

Telefone: 22334455

CPF: 222.222.222.2201/01/2012 Ciência da Computação

Data de nascimento: 01/01/2012 Ciência da Computação

Curso de Formação: Ciência da Computação

Tem razão ml126 ... agora rolou legal da maneira que você me ensinou.

Muito obrigado ....

Só ficou uma dúvida.

Qual a maneira correta de se fazer?

Aprendi várias nesse tópico várias formas funcionais, mas qual não é gambiarra.

Não me levem a mal, só não quero ter vícios.

abraços!

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,4k
×
×
  • Criar Novo...