Ir ao conteúdo
  • Cadastre-se

Loop infinito ao inserir caractere em int


Posts recomendados

 

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");
}
}

 

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...