The truth is, although practice has shown that the function printf()
is quite useful for multiple purposes, unfortunately the function scanf()
it’s not that useful. Particularly, it doesn’t handle entries as well outside of the expected pattern, as you might check.
In this case, the standard recommendation of experienced C users is to get the entire line for a buffer using fgets()
(never gets()
) and then analyze the input, possibly using sscanf()
for this. For example:
int
main(int argc, char ** argv) {
static char buffer[1024];
int opcao_menu = 0;
while (opcao_menu != 5) {
// Literais de string uma após a outra são concatenadas
// Útil para escrever strings longas
fputs("\nEscolha sua opção\n\n\n"
"1 - ...\n"
"2 - ...\n"
"3 - ...\n"
"4 - ...\n"
"5 - Sair\n"
"\n\nSua escolha: ", stdout);
// Obtém a linha que o usuário digitou até o [Enter]
fgets(buffer, sizeof(buffer), stdin);
// Tenta extrair um número do buffer e verifica os limites do número
if ((sscanf(buffer, "%d", &opcao_menu) < 1) ||
(opcao_menu < 1) ||
(opcao_menu > 5)) {
system("cls");
fputs("Opção inválida!\n", stdout);
} else switch (opcao_menu) {
// Aqui tratamos os diferentes casos,
// tipicamente chamando uma função para fazê-lo
case 1: do_1(); break;
case 2: do_2(); break;
case 3: do_3(); break;
case 4: do_4(); break;
case 5: fputs("Até mais!\n", stdout); break;
}
}
return 0;
}
nor does it compile
– Maniero