LLuciano Postado Agosto 20, 2023 em 17:16 Compartilhar Postado Agosto 20, 2023 em 17:16 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
mauro_b Postado Agosto 23, 2023 em 22:29 Compartilhar Postado Agosto 23, 2023 em 22:29 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
LLuciano Postado Agosto 24, 2023 em 17:22 Autor Compartilhar Postado Agosto 24, 2023 em 17:22 (editado) 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 Agosto 24, 2023 em 19:11 por LLuciano Só agora consegui compilar o código. 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
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.