Ir ao conteúdo
  • Cadastre-se
Joao Pedro Villas

Loop infinito ao inserir caractere em int

Recommended Posts

 

Bom dia programadores , o codigo ao meu ver está 90% ok mas quando eu insirio na sequencia um caractere ele entra em loop infinito e eu gostaria de saber o que devo fazer pra corrigir este problema , obrigado pela atenção 


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#define TAM 200


void delay ();
void bv();
int comparador (int a[],int *l,int *e);	


main(){
int i ,nivel=1,sequencia[TAM],l=3,estagio=1;
bv();
srand(time(NULL));
	do{
		printf("\nNIVEL ATUAL : %d\n\nMEMORIZE A SEQUENCIA ABAIXO // ESTAGIO ATUAL : [%d]\n\n",nivel,estagio);
	for (i=0;i<TAM;i++){
	sequencia[i]= rand()%3*nivel+1;	
	}
		for (i=0;i<l;i++){
		printf("%d ",sequencia[i]);
		}
			delay();
			system("CLS");
			comparador(sequencia,&l,&estagio);		
	if(estagio==8){
		nivel++;
		printf("PARABENS voce ESTA NO LEVEL %d\n",nivel);
		estagio=1;
		Sleep(5000);
		system("CLS");
		l=3;
	}
		}while(nivel>0);
     printf("MEUS PARABENS voce CONSEGUIU PASSAR POR TODOS OS NIVEIS\n voce E UM GENIO DE VERDADE!!");
delay();
}

void delay(){
Sleep(10000);
}
void bv(){
    printf("BEM VINDO AO GENIUS \n\n");
    printf("O JOGO CONSISTE NA REPETICAO DA SEQUENCIA ABAIXO \n\n");
    printf("BOA SORTE !!!!\n\n");
    Sleep(3000);
    system ("CLS");
    printf("VAMOS COMECAR\n");
    Sleep(3000);
    system("CLS");
}
int comparador (int a[], int *l,int *e){
  int resp[TAM],cr=0,c;
  printf("DIGITE A SEQUENCIA:\n\n");
  for(c=0;c<*l;c++){
	scanf("%d",&resp [c]);
}
for(c=0;c<*l;c++){
	if(resp[c]==a[c])
	cr++;
}
if(cr==*l){
	printf("\nRESPOSTA CORRETA\n");
    Sleep(2000);
    system("CLS");
    *l=*l+1;
    *e=*e+1;
    return (*l);
    return (*e);
  }else{                        
	printf("\nRESPOTA INCORRETA\n\n");
	printf("SEU NIVEL FOI RESETADO\n");
    *l=3;
    *e=1;
    return (*e);
    return (*l);
  Sleep(2000);
system("CLS");
}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função scanf pode devolver o número de dados atribuídos corretamente, ou bem o número pode ser inferior ao desejado, até mesmo incluindo zero, no caso de um erro de atribuição. Se ocorrer um erro de entrada antes de qualquer conversão, a função scanf retorna o valor da macro EOF.

sabendo isso veja todos os tipos de erros que podem retornar scanf:
 

int main() {
    int n;
    
    int res = scanf ( "%d", &n );
    
    if ( res == 0 )
        printf ( "Encontrado falho\n" );
        
    if ( ferror ( stdin ) )
        perror ( "error" );
        
    if ( feof ( stdin ) )
        printf ( "end-of-file encontrado.\n" ); // Ctrl+Z en Windows
        
    printf ( "\n%d", n );
    
    return 0;
}


Agora bem... no seu caso, quando você entra com um char e scanf espera um int você está causando um erro de atribuição, nesse caso scanf vai retornar zero, porque nenhuma atribuição será feita, então você deve aproveitar o treixo de código abaixo para averiguar se o que o usuário entrou é uma tecla ou um numero:
 

    int res = scanf ( "%d", &n );
    
    if ( res == 0 )
        printf ( "Encontrado falho\n" );
	else
	    //siga em frente


Seu programa meio arrumado seria algo como:
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#define TAM 200

void flush();
void delay ();
void bv();
int comparador ( int a[], int *l, int *e );


int main() {
    int i, nivel = 1, sequencia[TAM], l = 3, estagio = 1;
    bv();
    srand ( time ( NULL ) );
    
    do {
        printf ( "\nNIVEL ATUAL : %d\n\nMEMORIZE A SEQUENCIA ABAIXO // ESTAGIO ATUAL : [%d]\n\n", nivel, estagio );
        
        for ( i = 0; i < TAM; i++ ) {
            sequencia[i] = rand() % 3 * nivel + 1;
        }
        
        for ( i = 0; i < l; i++ ) {
            printf ( "%d ", sequencia[i] );
        }
        
        delay();
        system ( "CLS" );
        comparador ( sequencia, &l, &estagio );
        
        if ( estagio == 8 ) {
            nivel++;
            printf ( "PARABENS voce ESTA NO LEVEL %d\n", nivel );
            estagio = 1;
            Sleep ( 5000 );
            system ( "CLS" );
            l = 3;
        }
    } while ( nivel > 0 );
    
    printf ( "MEUS PARABENS voce CONSEGUIU PASSAR POR TODOS OS NIVEIS\n voce E UM GENIO DE VERDADE!!" );
    delay();
}

void delay() {
    Sleep ( 10000 );
}
void bv() {
    printf ( "BEM VINDO AO GENIUS \n\n" );
    printf ( "O JOGO CONSISTE NA REPETICAO DA SEQUENCIA ABAIXO \n\n" );
    printf ( "BOA SORTE !!!!\n\n" );
    Sleep ( 3000 );
    system ( "CLS" );
    printf ( "VAMOS COMECAR\n" );
    Sleep ( 3000 );
    system ( "CLS" );
}
int comparador ( int a[], int *l, int *e ) {
    int resp[TAM], cr = 0, c;
    printf ( "DIGITE A SEQUENCIA:\n\n" );
    
    for ( c = 0; c < *l; c++ ) {
        int check = 0;
        do{
            int temp;
            int n = scanf ( "%d%*c", &temp );
            if ( n == 0 ){
                printf ( "Encontrado falho. Volte a digitar a serie\n" );
                c=0;
                n=-1;
                check = 0;
                flush();
            }else{
                resp [c] = temp;
                check++;
            }
        }while( !check );
        
    }
    
    for ( c = 0; c < *l; c++ ) {
        if ( resp[c] == a[c] )
            cr++;
    }
    
    if ( cr == *l ) {
        printf ( "\nRESPOSTA CORRETA\n" );
        Sleep ( 2000 );
        system ( "CLS" );
        *l = *l + 1;
        *e = *e + 1;
        return ( *l );
        return ( *e );
    } else {
        printf ( "\nRESPOTA INCORRETA\n\n" );
        printf ( "SEU NIVEL FOI RESETADO\n" );
        *l = 3;
        *e = 1;
        return ( *e );
        return ( *l );
        Sleep ( 2000 );
        system ( "CLS" );
    }
}

void flush() {
    //funçao excelente para limpar o buffer de entrada.
    int ch;
    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×