The truth is that while practice has shown that the printf()
function is very useful for multiple purposes, unfortunately the scanf()
function is not that useful. In particular, it does not handle as well as expected non-standard inputs, as you could verify.
In this case, the default recommendation of experienced C users is to get the entire row for a buffer using fgets()
( never gets()
) and then parse the input, possibly using sscanf()
to do so. 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;
}