Jump to content

Erro de input em programa de número aleatório


Recommended Posts

Posted

Muito boa noite a todos.

Por brincadeira e para treinar o uso de funções que geram numeros aleatórios como a rand() e srand(). Decidi aceitar o desafio de um questionário e fazer o seguinte programa:

#include <stdlib.h>		/*for library rand()*/
#include <time.h>		/*for time()*/
#define MAX 100
extern int rand0(void);

int main(void)
{
	int num,status,guess,count=0;
	printf("Vamos fazer um jogo.\n");
	printf("O computador vai gerar um numero aleatório.Enter 0 e %d...\n",MAX);
	printf("Esse é o numero Mágico. Tente adivinhá-lo.\n\n");

	srand((unsigned int) time(0));	/*randomize seed*/
	num=rand()%MAX+1;
	
	do
	{	
		printf("Introduza o seu numero candidato:\n");
		status=scanf("%d",&guess);
		if(status)
		{
			++count;
			if(num>guess)
			{
				printf("Está muito frio!\n");	
				printf("Tente um numero mais alto!\n");	
			}
			else if(num<guess)
			{
				printf("Está muito quente!\n");	
				printf("Tente um numero mais baixo!\n");	
			}
			
		}
		else
		{
			printf("Insira somente digitos por favor...\n");	
			fflush(stdin);
			continue;
		}
	}while(num!=guess);
	
	printf("Parabéns!!! Acertou no número Mágico!");
	printf("De facto %d é o numero Mágico!\n",num);
	printf("Precisou de %d tentativas apenas...\n",count);
	
return 0;
}

Gosto do programa, da estrutura do mesmo, encontrei esta solução, e o programa corre bem até... inserir um caracter não-digito. O programa entra em loop infinito e tenho que cancelar o mesmo. Ora bem, criei aquele else:

else
		{
			printf("Insira somente digitos por favor...\n");	
			fflush(stdin);
			continue;
		}

a pensar que resolveria essa situação se ela surgisse, mas é precisamente esse bloco que dá problema. E afinal o fflush(stdin) não está a fazer a sua "função"; ou está algo inompleto?

Agradecia imenso uma ajuda do forúm.

Um abraço a todos.

Posted

Já funciona! Encontrei a resposta num livro de C que estou a seguir. Eu sabia que tinha lido algo sobre descartar o new line que fica no buffer.

Ora bem a seguir a:

status=scanf("%d",&guess);
		getchar();/*acrescentado ao código*/

leva com o getchar para "comer" o caracter '\n' que fica no buffer quando damos enter.

Sendo assim:

else
		{
			printf("Insira somente digitos por favor...\n");	
			fflush(stdin); /* é desnecessário, pode sair que o programa corre na mesma*/
			continue;
		}

 

11 horas atrás, HappyHippyHippo disse:

existem maneiras  mais "limpas" para resolver o prolema dos dados de entrada, algo com o fgets e sscanf

Certamente, acredito que sim... Apenas, como essas funções estão num capitulo mais adiantado  do livro que estou a seguir não as tenho ainda como ferramentas para resolver este problema, mas lá chegarei, com tempo.

O programa já corre, portanto ficou desfeita a minha dúvida. abraço

Posted
Em 14/02/2018 às 23:56, Inacabado disse:

Já funciona! Encontrei a resposta num livro de C que estou a seguir. Eu sabia que tinha lido algo sobre descartar o new line que fica no buffer.

Ora bem a seguir a:


status=scanf("%d",&guess);
		getchar();/*acrescentado ao código*/

leva com o getchar para "comer" o caracter '\n' que fica no buffer quando damos enter.

Sendo assim:


else
		{
			printf("Insira somente digitos por favor...\n");	
			fflush(stdin); /* é desnecessário, pode sair que o programa corre na mesma*/
			continue;
		}

Certamente, acredito que sim... Apenas, como essas funções estão num capitulo mais adiantado  do livro que estou a seguir não as tenho ainda como ferramentas para resolver este problema, mas lá chegarei, com tempo.

O programa já corre, portanto ficou desfeita a minha dúvida. abraço

A linha que adicionaste apenas remove um caracter do buffer (pode ser o \n ou outro qualquer se o utilizador introduzir um valor inválido).  Para esse efeito em particular, também prefiro a solução do @HappyHippyHippo: status=scanf(" %d",&guess);.

Contudo, diria que o código fica mais robusto com algo deste género:

status=scanf(" %d",&guess);
while ((c = getchar ()) != '\n' && c != EOF);

A ideia é depois da tentativa de leitura do valor remover tudo o que estava na linha.

Já agora, rand()%MAX+1  gera-te um valor entre 1 e MAX (e não entre 0 e MAX).

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.