Ir ao conteúdo

C Como evitar o looping caso seja digitado sem querer um caractere


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Boa noite, tô com uma dúvida, alguém pode me ajudar? Estou fazendo uma questão de controle de estoque, já está quase completo, o problema é que quando vai digitar o código do produto e sem querer digito um caractere no lugar de um inteiro, ele cria um looping.. como faria pra resolver?

Segue anexo parte do código (se precisar dele inteiro, posso mandar):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main ()
{	
	int C[4], Q[4], repetido, N, x = 0;
	float PrecoUnitario[4];
	while(x < 4) {
		printf("Codigo do Produto\n");
		scanf("%d", &N);
		int y = 0;
		while(y < x) {
			if(N == C[y]){
                repetido = 1;
                break;
            }
			y = y + 1;
		}
        if(repetido == 1) {
            printf("Codigo %d repetido, tente novamente.\n", N);
            repetido = 0;
            x = x - 1;
        } else {
            C[x] = N;
            printf("Estoque Disp.\n");
			scanf("%d", &Q[x]);
			printf("Preco Unitario do Produto\n");
			scanf("%f", &PrecoUnitario[x]);
        }
		x = x + 1;
	}

	system("cls");
  
  // continua aqui

 

39 minutos atrás, natesp disse:

Boa noite, tô com uma dúvida, alguém pode me ajudar? Estou fazendo uma questão de controle de estoque, já está quase completo, o problema é que quando vai digitar o código do produto e sem querer digito um caractere no lugar de um inteiro, ele cria um looping.. como faria pra resolver?

Segue anexo parte do código (se precisar dele inteiro, posso mandar):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main ()
{	
	int C[4], Q[4], repetido, N, x = 0;
	float PrecoUnitario[4];
	while(x < 4) {
		printf("Codigo do Produto\n");
		scanf("%d", &N);
		int y = 0;
		while(y < x) {
			if(N == C[y]){
                repetido = 1;
                break;
            }
			y = y + 1;
		}
        if(repetido == 1) {
            printf("Codigo %d repetido, tente novamente.\n", N);
            repetido = 0;
            x = x - 1;
        } else {
            C[x] = N;
            printf("Estoque Disp.\n");
			scanf("%d", &Q[x]);
			printf("Preco Unitario do Produto\n");
			scanf("%f", &PrecoUnitario[x]);
        }
		x = x + 1;
	}

	system("cls");
  
  // continua aqui

 

Opa, consegui resolver fazendo o teste:

int a = scanf("%d", &N);
		if (a == 0) {
			printf("\nErrado, digitou um caractere (Digite apenas n. inteiros).\n");
			exit(0);
		} else {
		// continua

:D

  • Amei 1
  • Solução
Postado

@lsnkesp      muito boa a solução suà ,  mas ,  ali ele vai fechar o programa e perderá o que foi Digitado ,  ! ,  seria melhor mostra aquela msg de erro e voltar a prosseguir com o programa novamente ,  e também usar fgets ao invés de scanf , e esse seu código com muitas modificações ficou assim :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
float ler_teclado();
int main ()
{
    int C[4], Q[4], repetido, N,x = 0,w;
    char aux[10];
    float PrecoUnitario[4];
    while( x < 4 )
    {
        printf("Codigo do Produto\n");
        N = ler_teclado();                          /// lê o teclado até digitar apenas numeros
        printf("retornou %2d\n",N);                 /// ver se func certo !
        int y = 0;
        while( y < x )
        {
            if( N == C[y] )
            {
                repetido = 1;
                break;
            }
            y = y + 1;
        }
        if( repetido == 1 )
        {
            printf("Codigo %d repetido, tente novamente.\n", N);
            repetido = 0;
            x = x - 1;
        }
        else
        {
            C[x] = N;
            printf("Estoque Disp.\n");
            Q[x] = ler_teclado();                   /// lê o teclado até digitar apenas numeros
            printf("retornou %2d\n",N);             /// ver se func certo !
            printf("Preco Unitario do Produto\n");
            PrecoUnitario[x] = ler_teclado();       /// lê o teclado até digitar apenas numeros
            printf("%.2f\n",PrecoUnitario[x]);      /// ver se func certo !
        }
        x = x + 1;
    }
}
float ler_teclado()
{
    int w;
    float N;
    char aux[10];
    label :
        fflush(stdin);
        fgets(aux,10,stdin);                        /// fgets pega a string + '\n' + '\0'
        for(w=0;aux[w] !='\n'; w++)
        {
            if( ! isdigit(aux[w]) && aux[w] != '.' )
            {
                printf("Errado, digitou um caractere (Digite apenas n. inteiros).\n");
                goto label;
            }
        }
        N = atof(aux);                              /// converte string para float
        printf("atoi aux = %.2f\n",N);
        return N;
}

 

  • Obrigado 1
Postado

@devair1010 Boa tarde (quase noite), confesso que eu não conhecia essa maneira, há algumas partes do código que eu não entendi, como essa:

Citação

if( ! isdigit(aux[w]) && aux[w] != '.' )

Especificamente a parte após o &&.

Entendo que o isdigit verifica se o que foi digitado é um valor decimal.

Estava dando uma pesquisada e consegui entender melhor para que serve o " label: goto label; "

Também dei uma pesquisada no uso do fgets e percebi que realmente é mais vantajoso que o próprio "gets", além do scanf.

  • Obrigado 1
Postado

@lsnkesp    essa linha aqui 

 if( ! isdigit(aux[w]) && aux[w] != '.' ) /// se o caractere que esta na posição da string 
                                          /// apontada por w , não for um caractere numérico 
                                          /// de 0 a 9   e  também não for o caractere ponto
                                          /// mostra msg de erro

pois isdigit verifica um caractere de cada vez da string , e se for um digito  de 0 até 9  ele retorna true , e então você coloca um loop para percorrer todos os caracteres da string fazendo essa comparação  e o " ! " significa não , então se não for um digito numérico e nem o ponto , digitou errado .

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!