Jump to content

Problem,a ao condicionar o input a digitos em C


Inacabado

Recommended Posts

Muito bom dia a toda a comunidade, e um muito bom dia ao meu amigo HappyHippo em especial;

Tenho um problema no seguinte código:

#include <stdio.h>

void dobro(int *a);
int main()
{
	int n=0;
	printf("introduza numero:\n");
	while (scanf("%d",&n)==0)
			fflush(stdin);
	dobro(&n);
	printf("Dobro: %d\n",n);
return 0;
}
void dobro(int *a)
{
	*a*=2;
}
~

O problema é o seguinte: quero condicionar a entrada de dados a só aceitar dígitos. Ora eu costumo fazer de outra maneira

 do {...}(while n > '9' && n< '0')

, mas encontrei esta "solução" que achei elegante no livro do Luís Damas que costumo estudar/consultar e quis aplicar. O problema é que quando insiro um numero a seguir a ter inserido uma letra ele não me dá o dobro. Parece que não salta o ciclo while!!!

Agradecia imenso uma indicação que me leve á resolução deste problema. Muito obrigado a todos um abraço a todos e um especial para o HappyHippo.

Edited by Inacabado
Link to comment
Share on other sites

o código apresentado não tem problema nenhum, o que necessitas é perceber o que está a acontecer com a instrução fflush(stdin)

while (scanf("%d", &n) == 0) // enquanto não for possível ler um valor numérico do buffer de leitura
 fflush(stdin);             // limpar o buffer de leitura

agora imagina que inseres a string "n23", o scanf irá falhar por causa do caracter 'n'. devido a isso, a instrução fflush será chamada que irá limpar tudo o que se encontra no buffer de entrada. isto é, o buffer fica sem nada o que irá fazer com que a chamada do scanf do ciclo fique à espera que voltes a inserir novos dados.

para ver se percebes melhor o que acontece, altera o código para algo mais user-friendly:

do
{
 printf("valor ? : ");
 fflush(stdout);

 fflush(stdin);
} while (!scanf("%d", &n));
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

agora imagina que inseres a string "n23", o scanf irá falhar por causa do caracter 'n'. devido a isso, a instrução fflush será chamada que irá limpar tudo o que se encontra no buffer de entrada. isto é, o buffer fica sem nada o que irá fazer com que a chamada do scanf do ciclo fique à espera que voltes a inserir novos dados.

Sim mas se inserir somente "n" e carregar "enter", ele limpa o buffer e aguarda a entrada de outro valor. A seguir ao "n" eu insiro o "23" e carrego "enter" e não me dá o dobro!!! Continua a receber valores... Isso é que eu não entendo; pois o segundo valor era um inteiro, por isso deveria saltar o ciclo while, pois a condição já não se verificava!

Edited by Inacabado
Link to comment
Share on other sites

Sim mas se inserir somente "n" e carregar "enter", ele limpa o buffer e aguarda a entrada de outro valor.

não, ele nem grava valor nenhum

A seguir ao "n" eu insiro o "23" e carrego "enter" e não me dá o dobro!!! Continua a receber valores...

mas isso eu já expliquei ... ao ler o 'n' falha e o buffer de leitura é limpo

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Ok Acho que não estou a perceber bem o que é que a função fflush(stdin) && fflush(stdout) fazem... Vou-me documentar melhor a respeito.

Já agora gostava de perguntar se mantendo o mesmo código:


while (scanf("%d",&n)==0)
   fflush(stdin);

... e utilizando este desenho com as alterações ainda necessárias a fazer consigo limitar a entrada do scanf apenas a aceitar digitos, ou terei de voltar á solução antiga do

 do {...}(while n > '9' && n< '0')

???

Já agora referir que gostei da solução por apresentada do:

 while (!scanf("%d", &n));

Muito obrigado mesmo pela ajuda prestada. Abraço

Edited by Inacabado
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.