Ir para conteúdo

Menu numérico sem erros.


LLuciano

Posts Recomendados

Olá pessoal!

Estou estudando C sozinho. Em vários exercícios tem a necessidade de criar uma espécie de menu com opções. Mas, considerando o que eu aprendi até agora, é muito fácil de dar um erro caso o usuário digite algo errado, como por exemplo uma letra quando eu esperava um inteiro. Isso me dá uma angustia, ficar fazendo exercício cujo o programa pode ser facilmente quebrado.

Eu procurei uma função na biblioteca padrão para isso mas não encontrei, então tentei fazer eu mesmo uma solução.  Eis as dúvidas:

1 - Existe alguma função que já implementa isso?

2 - O código que desenvolvi está funcionando... mas parece que estou com a mente viciada.Fico com a impressão de que poderia ser mais simples mas não consigo fazer melhor.

Alguém tem alguma sugestão? (Fiz somente considerando opções numéricas, não alfabéticas, ou com palavras)

Eis o código:

#include <stdio.h>
#include <ctype.h>

int menuNumberCheck (void);

int main(void){
	int choice = 0;
	do {
		printf("%s", "Digite um número de 0 a 10 ou digite 11 para finalizar: ");
		choice = menuNumberCheck();

		if (choice < 0 || choice > 11){
			puts("Opção inválida");
		} else printf("Você escolheu a opção %d\n", choice);
		
	} while (choice != 11);

	puts("Programa finalizado");
	return 0;
}

int menuNumberCheck (void){

	int check = 1;
	char c;
	int number = 0;
	int loopcount = 0;

	while ((c = getchar()) != '\n'){
		
		if (isdigit(c) && check == 1){
			//check multpiplication overflow:
			//se verdadeiro é que vai ocorrer overflow e retornar erro.
			//multiplica o dígito pode 10 para encontrar a posição (unidade, dezena e etc);
			if (__builtin_smul_overflow(number, 10, &number)) {
				puts("Overflow");
				check = 0;

			//check sum overflow
			//soma o digito encontrado na unidade
			//se verdadeido é que vai ocorrer overflow e retornar erro.
			// c-48 para encontrar o número na tabela ANSCI-I
			} else if (__builtin_sadd_overflow(number, c-48, &number)) {
				puts("Overflow");
				check = 0;
			} else loopcount++;

		} else check = 0;//falso se encontrar algum caracter não numérico.
	}
	if (check == 0 || loopcount == 0){
		return -1;
	} else return number;
}

 

 

Link para o comentário
Compartilhar em outros sites

Olá, @LLucianoexperimente uso com a função scanf da biblioteca padrão, após leitura de sua definição reescreva teu código. 

Um exemplo C'11

#include <stdio.h>

int main()
{
    int choice = -1;
	do {
		printf("%s", "Digite um número de 0 a 10 ou digite 11 para finalizar: ");
		int decimal_input = scanf("%d", &choice);

		if (choice < 0 || choice > 11){
			puts("Opção inválida");
			if (decimal_input == NULL) scanf("%*s"); /*se entra com caractere não decimal, consuma sua string*/
		} else printf("Você escolheu a opção %d\n", choice);
		
	} while (choice != 11);

	puts("Programa finalizado");
	return 0;
}

 

  • Haha 1
Link para o comentário
Compartilhar em outros sites

Em 23/08/2023 em 19:29, mauro_b disse:

Olá, @LLucianoexperimente uso com a função scanf da biblioteca padrão, após leitura de sua definição reescreva teu código. 

Um exemplo C'11

#include <stdio.h>

int main()
{
    int choice = -1;
	do {
		printf("%s", "Digite um número de 0 a 10 ou digite 11 para finalizar: ");
		int decimal_input = scanf("%d", &choice);

		if (choice < 0 || choice > 11){
			puts("Opção inválida");
			if (decimal_input == NULL) scanf("%*s"); /*se entra com caractere não decimal, consuma sua string*/
		} else printf("Você escolheu a opção %d\n", choice);
		
	} while (choice != 11);

	puts("Programa finalizado");
	return 0;
}

 

Nossa! Valeu!

Era só ter estudado o scanf decentemente! Tinha que ser mais simples que eu estava fazendo.

 

Editado por LLuciano
Só agora consegui compilar o código.
  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...