Jump to content

Menu numérico sem erros.


LLuciano

Recommended Posts

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 to comment
Share on other 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 to comment
Share on other 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.

 

Edited by LLuciano
Só agora consegui compilar o código.
  • Agradecer 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...