• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ang3lo

Duvida

15 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha lá: se meteres "abcdefghijkl" (só coisas inválidas) quantas vezes é que ele te diz que tens uma opção inválida?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E qual é a diferença entre o tratamento de coisas inválidas e coisas válidas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é igual, se tiveres msn e melhor falarmos por la caso não haja problema para ti claro.

Assim também te envio o código todo e vês.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então para fazer isso qual é a melhor maneira, para funcionar em todos os compiladores?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:

0

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