Problema de entrada com as funções gets e fgets. [RESOLVIDO]

1. Problema de entrada com as funções gets e fgets. [RESOLVIDO]

Mateus
mateus10

(usa CentOS)

Enviado em 19/01/2014 - 15:27h

Olá Galera Boa Tarde! sou iniciante em programação. Estou com o seguinte problema: Eu criei uma função onde ela é chamada na função main, para que o usuario entre com uma string, porém as funções gets e fgets não estão pegando a entrada do teclado e o programa esta seguindo direto, ou seja, ele esta pulando a chamada destas duas funçoes (gets e fgets).... Como faço pra solucionar ??? Aqui esta a parte do código:

int cript(void)
{
int i,x;
char frase[50];

printf("\n\n Digite sua frase em texto puro: ");

gets(frase); // AQUI ESTÁ O PROBLEMA, O PROGRAMA NÃO
// AGUARDA A ENTRADA DO TECLADO
// E SEGUE O PROGRAMA ATÉ O FIM.

x = strlen(frase);
i = 0;

printf("\n\n Sua mensagem criptografada: ");

for (i = 0;i < x; i++) {
printf("%x",frase[i]+2);
}

printf(" \n\n\n Fim do Programa.\n ");
getch();
return 0;
}

Obrigado desde já! ;)



  


2. Re: Problema de entrada com as funções gets e fgets. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/01/2014 - 23:58h

Se antes de ler a frase você tiver lido alguma coisa com scanf(), é possível que esteja com lixo (caracteres remanescentes de algo que você digitou, mas que não foram consumidos -- incluindo o sinalizador de que você apertou "Enter") no buffer de entrada.

Há dezenas de artigos na comunidade mencionando o problema e possíveis soluções. Para não repisar a questão, por favor faça uma busca nos arquivos do fórum.


3. Problema de entrada com as funções gets e fgets.

Mateus
mateus10

(usa CentOS)

Enviado em 20/01/2014 - 11:04h

Vlw Paulo1205, consegui encontrar a solução, os caracteres estavam na memoria temporaria do teclado, e quando era chamado o segundo gets(); ele inseria o enter como um dado e seguia o programa,pra isso existe a funçao fflush(stdin), para limpar a memoria temporaria... Vlw Abração!


4. Re: Problema de entrada com as funções gets e fgets. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/01/2014 - 04:59h

De todas as soluções possíveis, a que você escolheu é uma das -- senão *A* -- que considero pior.

É importante que você saiba que o padrão do C só define o comportamento da função fflush() quando aplicada a streams de saída de dados. O comportamento que você obtém ao aplicar fflush() a um stream de entrada como stdin não é prescrito nem garantido por norma alguma. Diferentes sistemas operacionais, ou até mesmo diferentes implementações de compiladores e/ou bibliotecas no seu próprio sistema, podem tratar algo como fflush(stdin) podem ignorar a instrução completamente, ou podem derrubar o programa ou mesmo travar a máquina -- e todos eles podem estar conforme o que a norma prega para fflush(), já que ela só trata de streams de saída.

Prefira uma solução mais universal e que não extrapole os padrões. Ler sempre linhas inteiras com fgets() e depois extrair as partes interessantes com sscanf(), ou mesmo strtok() e strtol(), strtod() e similares é um modo de fazer. Outra coisa interessante é você aprender a usar adequadamente, dentro da string de formatação de scanf(), espaços, conversões suprimidas ("%*..."), contagem de caracteres consumidos ("%n") e conversão de strings contendo apenas caracteres de um certo conjunto ("%[...]").

Além disso é muito importante que você *SEMPRE* teste o valor de retorno de qualquer função de entrada de dados: não apenas as funções da família de scanf(), mas também fgets(), getchar(), ungetc() e todas as demais.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts