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