LLuciano Posted August 20, 2023 at 05:16 PM Share Posted August 20, 2023 at 05:16 PM 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; } Quote Link to comment Share on other sites More sharing options...
mauro_b Posted August 23, 2023 at 10:29 PM Share Posted August 23, 2023 at 10:29 PM 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; } 1 Quote Link to comment Share on other sites More sharing options...
LLuciano Posted August 24, 2023 at 05:22 PM Author Share Posted August 24, 2023 at 05:22 PM (edited) 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 August 24, 2023 at 07:11 PM by LLuciano Só agora consegui compilar o código. 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.