Menu em C

Ang3lo

Power Member
Boas pessoal,

Estou a fazer um trabalho para a universidade e estou com o seguinte problema no menu em c, tenho la as opções numeradas de 1 a 9, funciona tudo direito mas no caso de o utilizador digitar "123" o programa não diz "opção invalida" ao invés disso ele vai para o menu "1" porque é o primeiro carácter que ele lê.
A minha duvida e como fazer ele dizer que a opçao é invalida porque se calhar vou ter de ter uma opçao "10" e se tiver de a usar estou em maus lençois.Estou a fazer o menu com switch cases e os dados de entrada sao do tipo char.

Obrigado desde ja

void submenu5()
{
char op5;
do
{
system("CLS");
printf("\n****** Pagamento ******\n\n\n");
printf(" 1 - Anuidade\n");
printf(" 2 - Mensalidade\n\n");
printf(" 0 - Sair\n\n");
printf("Opcao: ");
fflush(stdin);
op5=getchar();
switch (op5)
{
case '1':
pagarAnu();
break;

case '2':
pagarMen();
break;

case '0': break;

default : printf("\nOpcao invalida\n");
printf("\n\nPrima uma tecla para continuar");
fflush(stdin);
getchar();
break;
}
}while(op5!='0');
fflush(stdin);
}

exemplo do codigo
 
Última edição:
A opção que me vem agora a cabeça é os dados de entrada serem do tipo int e fazeres uma avaliação, usando condicionais.
Não sei é se podes fazer uma coisa do tipo a seguir ao switch antes dos case utilizar um if/else.
 
O teu professor é o rei. Tenta então implementar algo parecido com aquilo que indiquei naquela thread, mas lendo o char com o scanf e analisando o valor retornado por este.
 
Código:
void menuPrincipal(void)
{
    int opcao;
    _clrscr();
      for(;;)
      {
          puts(   "\n\n"
            "____________________________""\n\n"
             "|1| Especialidades\n"
                   "|2| Consultas\n"
             "|3| Utentes\n"
             "|4| Medicos\n"
            "____________________________""\n"
                      "\n|0| Sair do Programa\n"
            "____________________________");
        scanf( " %d", &opcao );
        /* "passa por cima" do resto da linha */
        while( getchar() != '\n' );_clrscr();
            switch( opcao )
              
            {
            case 1: _clrscr(); 
                    menuEspecialidades();
                    break;
            case 2: _clrscr();
                    menuConsultas();
                               break;
            case 3: _clrscr();
                    menuUtentes();
                    break;
            case 4: _clrscr();
                    menuMedicos();
                    break;
                      case 0:  exit(0);
            }
    }

}
tens aqui um a prova de bala

não tenho a certeza se a função _clrscr(), foi criada ou é de sistema , ja não lembro , mas penso que foi criada
 
Esses _clrscr() cheira-me a coisas made in Visual Studio, e aposto que se eu experimentar isso em Linux não vai compilar. E usar ciclos infinitos para implementar menus nunca foi uma coisa decente. Os ciclos do...while servem para alguma coisa.
 
Ja ta resolvido o problema usei o seguinte código

Código:
int get_opcao(void) 
{
  int c1, c2;
  c1 = getchar();
  if (('0' <= c1) && (c1 <= '9')) {
    c2 = getchar();
    if (c2 != '\n') {
      /* invalido! */
      fflush_stdin();
      c1 = -1;}

  } else {
    fflush_stdin();
    c1 = -1;
  }
  return c1;
 
Última edição pelo moderador:
Back
Topo