Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Ang3lo

Duvida

Mensagens Recomendadas

Ang3lo    0
Ang3lo

Boas malta,

Tenho um duvida em C, estou a fazer um programa para a universidade onde de momento me encontro na parte dos menus do programa tenho as opções numeradas de 1 a 9 que depois entram noutros menus, mas o problema é se meter "123" ele entra na opção  1 depois passa para a opção dois do menu seguinte e para a 3 do seguinte. Agora o que queria saber é se há maneira de limitar esta escrita para apenas um carácter para isto não acontecer.

Desde já o meu obrigado

Angelo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Em standard C, sem extensões, podes fazer assim

1) ler uma linha completa ("123\n") com fgets()

2) isolar o primeiro caracter válido ('1')

3) ignorar o resto da linha

4) apresentar o menu seguinte

Se não te importas de usar extensões, dá uma olhada à biblioteca ncurses.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ang3lo    0
Ang3lo

Ja resolvi esse problema, só tinha que limpar o buffer assim já não salta para menu seguinte.

Agora tenho outro problema tenho uma opçao "10" como faço para ler os dois caracteres?e que ele salta sempre para a opção 1

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Como é o teu código?

Ao apanhares um '1' não saltas logo para o menu1.

Esperas algum tempo (0.1 segundos ???) e se não detecteares mais nenhuma tecla saltas para o menu1; se detectares um '0' saltas para o menu10 ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ang3lo    0
Ang3lo

Estou a usar switch cases e os dados são do tipo char. O problema é que se meter "123" ele nao diz que a opçao é invalida vai par ao menu "1". Ele so assume o primeiro char pelo que estou  a perceber

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ang3lo    0
Ang3lo

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);
}

Este é um exemplo, que o codigo e grande demais para colar aqui

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Não é igual.

No `default` tens um fflush(stdin); nas outras opções não tens.

Mas fflush(stdin) não é fiável.

Só funciona como queres em alguns compiladores.

Noutros compiladores pode fazer outra coisa qualquer, desde não fazer nada a enviruzar-te o programa ou ficar à espera para sempre.

Imagina uma torneira (o stdin). Quando dizes despeja(torneira) (fflush(stdin)) tás a pedir ao computador para esperar até que a torneira seque :confused:

Não tenho msn, nem outro sistema de "Instant Messaging"; nem quero ter :P

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

void fflush_stdin(void)
{
    int c;
    while(((c = getchar()) != '\n') && (c != EOF)) /* void */;
}

E, no teu código, substituis todos os fflush(stdin) por fflush_stdin().

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ang3lo    0
Ang3lo

Meti mas tem um pequeno problema,

Ao ir para o menu "1" ele vai logo, mas la dentro só me deixa escolher uma opção, isto é, escolho a opção "1" que de momento é só um printf depois o programa diz para carregar numa tecla para continuar e volta ao menu "1" mas depois ja nao consigo escolher outra opção. :wallbash:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade