"Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

1. "Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

Lucas
~luJJc4

(usa Ubuntu)

Enviado em 20/11/2011 - 12:40h

Caros amigos, estou começando a estudar C e espero poder contar com vocês para tirar minhas duvidas..
minha ideia é ler duas letras e mostrar o valor respectivo em ASCII exemplo: "D" = 68, e por ai vai..
eu estou pedindo que me informem duas letras, a ideia e o programa ler a primeira informada e armazenar o valor em uma variável, depois ler mais uma letra e por fim, mostrar os respectivos valores, mais está aconteçendo que ele está lendo apenas a primeira e jogando o valor final na tela, como se o usuário pressionasse "enter" para a segunda letra.. ou seja está pulando o segundo scanf.. abaixo segue o código.. eu creio que não tem nada errado,
#include <stdio.h>

char fun ()
{
char l1;
printf ("\nInforme uma letra: ");
scanf ("%c",&l1);
return (l1);
}
char fun2 ()
{
char l1;
printf ("\nInforme a segunda letra: ");
scanf ("%c", &l1);
return (l1);
}
int main ()
{
char letra1,letra2;

letra1 = fun(); /* recebe a primeira letra */
letra2 = fun2(); /* recebe a segunda letra */
printf ("\nAs Letras informadas foram: %c, %c \n", letra1,letra2); /* mostrar as letras */
printf ("Os valores das letras em ASCII sao: %d, %d \n", letra1, letra2); /* mostrar valor ASCII das letras */

return(0);
}



/* tou utilizando funções só para aprendizagem mesmo.. */
Agradeço desde já.


  


2. Re: "Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

White Hawk
WhiteHawk

(usa Ubuntu)

Enviado em 20/11/2011 - 13:29h

Olá. Antes de ler qualquer dado através do teclado, utilize a seguinte função:


__fpurge(stdin);


Ela limpará o buffer do teclado.

Até mais.


3. Re: "Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

Marcos Paulo Ferreira
daemonio

(usa Slackware)

Enviado em 20/11/2011 - 13:29h

Olá lujjca,

Esse é um velho problema que sempre "pega" as pessoas que programam em C.

A grosso modo o que está ocorrendo é que o ENTER apertado pelo usuário no primeiro scanf também está sendo armazenado no buffer de teclado.

Quando o segundo scanf é executado, ele irá ler esse ENTER e não os dados do teclado.

A solução na maioria das vezes consiste em limpar o buffer do teclado sempre após um scanf ou alterar a chamada de scanf. Veja uma dica aqui no VOL de como fazer isso:

http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado

Então no seu caso, podemos fazer assim:

scanf ("%c",&l1);
getchar() ; // retira o ENTER

ou

scanf("%c%*c", &l1) ;
// o %*c irá ler o ENTER mas não o colocará em lugar nenhum

Essas das soluções funcionam somente se o buffer de entrada tiver apenas 2 bytes. Você pode usar as funções fflush (para o window$) e __fpurge (para o linux) para limpar o buffer por completo. Ficaria assim:

scanf("%c", &l1) ;
__fpurge(stdin) ;

Embora essas funções sejam úteis não é aconselhável utilizá-las por problemas de portabilidade e até de comportamento imprevisível.

Os comentários do link que te passei contem uma discussão boa sobre essas funções.

Bem, acho que é isso. Tentei explicar o máximo que pude porque você disse que era iniciante e esses detalhes sempre são importantes. Espero que a resposta lhe foi útil. ;s


Daemonio
t+




4. Re: "Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

Levi Gomes
levi linux

(usa Arch Linux)

Enviado em 20/11/2011 - 13:55h

Olá lujjca,
Tudo bem?
Como os colegas já disseram o problema no códio acima é com limpeza de buffer.
Mas gostaria de dar uma dica, quando fores postar trechos de código, podes utilizar as seguintes tags:

[ code] (não há esses espaços após o primeiro colchete, só utilizei para aparecer aqui na página)

seu código...

[ /code]

Fazendo isso teu código fica destacado com Syntax highlighting.

Ex:



#include <stdio.h>

char fun ()
{
char l1;
printf ("\nInforme uma letra: ");
scanf ("%c",&l1);
return (l1);
}
char fun2 ()
{
char l1;
printf ("\nInforme a segunda letra: ");
scanf ("%c", &l1);
return (l1);
}
int main ()
{
char letra1,letra2;

letra1 = fun(); /* recebe a primeira letra */
letra2 = fun2(); /* recebe a segunda letra */
printf ("\nAs Letras informadas foram: %c, %c \n", letra1,letra2); /* mostrar as letras */
printf ("Os valores das letras em ASCII sao: %d, %d \n", letra1, letra2); /* mostrar valor ASCII das letras */

return(0);
}



/* tou utilizando funções só para aprendizagem mesmo.. */



Espero que seja útil e boa sorte!


5. Re: "Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

Lucas
~luJJc4

(usa Ubuntu)

Enviado em 21/11/2011 - 05:38h

daemonio escreveu:

Olá lujjca,

Esse é um velho problema que sempre "pega" as pessoas que programam em C.

A grosso modo o que está ocorrendo é que o ENTER apertado pelo usuário no primeiro scanf também está sendo armazenado no buffer de teclado.

Quando o segundo scanf é executado, ele irá ler esse ENTER e não os dados do teclado.

A solução na maioria das vezes consiste em limpar o buffer do teclado sempre após um scanf ou alterar a chamada de scanf. Veja uma dica aqui no VOL de como fazer isso:

http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado

Então no seu caso, podemos fazer assim:

scanf ("%c",&l1);
getchar() ; // retira o ENTER

ou

scanf("%c%*c", &l1) ;
// o %*c irá ler o ENTER mas não o colocará em lugar nenhum

Essas das soluções funcionam somente se o buffer de entrada tiver apenas 2 bytes. Você pode usar as funções fflush (para o window$) e __fpurge (para o linux) para limpar o buffer por completo. Ficaria assim:

scanf("%c", &l1) ;
__fpurge(stdin) ;

Embora essas funções sejam úteis não é aconselhável utilizá-las por problemas de portabilidade e até de comportamento imprevisível.

Os comentários do link que te passei contem uma discussão boa sobre essas funções.

Bem, acho que é isso. Tentei explicar o máximo que pude porque você disse que era iniciante e esses detalhes sempre são importantes. Espero que a resposta lhe foi útil. ;s


Daemonio
t+




"Embora essas funções sejam úteis não é aconselhável utilizá-las por problemas de portabilidade e até de comportamento imprevisível."


isso que você falou é em relação ao fflush e o _fpurge(stdin) certo? cheguei a pensar que eram as funções que eu tinha escrito no codigo :s




6. Re: "Scanf" lendo antes mesmo que seja digitado! [RESOLVIDO]

Lucas
~luJJc4

(usa Ubuntu)

Enviado em 21/11/2011 - 05:39h

Muito Obrigado pela ajuda pessoal õ/






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts