Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

reebr

[Resolvido] Erro ao ler uma variável int

Recommended Posts

E aí :yay:/>

Estou fazendo um menu que tem 8 opções. Criei um loop para verificar a escolha do usuário, porém, independente do número que ele escolha DÁ ERRO (mesmo que seja uma das opções).

 

código:

          do
           {
            opc = 0; //variável OPÇÃO ( de 1 até 8 )

            -------
             INSTRUÇÕES
            -------

            opc = getch(); //INDEPENDENTE DO NUMERO ESCOLHIDO AQUI, DÁ ERRO

            if((opc == 0) || (opc > 8))
             {
              erro = 1;
              MessageBox(NULL, "Digite um numero Valido", "Operação Cancelada", MB_OK|MB_ICONSTOP);
             } 
           }while(erro == 1);

 

 

HÁ algum outro comando para leitura que não mostre o valor na tela do console? Ou, há alguma forma de fazer o getch() funcionar corretamente no meu código?

 

Alguém pode ajudar? :unsure:/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah sim, desculpa Isis.

Então, independente da resposta pega no getch(), ele entra nesse if()

if((opc == 0) || (opc > 8))
             {
              erro = 1;
              MessageBox(NULL, "Digite um numero Valido", "Operação Cancelada", MB_OK|MB_ICONSTOP);
             } 

 

Exemplo: se eu digitar 1,2,3,4,5,6,7, ele mostra a messagebox.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É porque opc sempre é maior que 8.

 

Tente fazer isso:

 

if((opc == '0') || (opc > '8'))
             {
              erro = 1;
              MessageBox(NULL, "Digite um numero Valido", "Operação Cancelada", MB_OK|MB_ICONSTOP);
             } 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que acontece é que um caracter é representado internamente como um inteiro. Por exemplo, o getch() no windows normalmente retorna um caracter em codificação ASCII, e, se você olhar na tabela ASCII, o número 0 tem valor 48, o 1 tem valor 49, o 2 tem valor 50, até o 9, que tem valor 57.

 

Então, ao comparar se o carater é maior que 8, com certeza ele será. Mas, ao comparar com o caracter '8', você está comparando na verdade com o valor 56 (caso a codificação for ASCII), que na codificação ASCII representa 8.

 

Agora, não use o valor 56 para representar '8', pois caso a codificação for diferente (por exemplo, UTF-16), o caracter '8' será representado de outro modo, o que quebraria seu código.

 

Tentei dar uma explicada rápida, estou sem tempo, se ficou meio confuso, sugiro procurar no google sobre como codificação de caracteres funciona.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora, só pra deixar completo, tem uma maneira mais portável ainda:

 

if(!isdigit(opc))
             {
              erro = 1;
              MessageBox(NULL, "Digite um numero Valido", "Operação Cancelada", MB_OK|MB_ICONSTOP);
             } 

 

Lembrando que tem que incluir o header <ctype.h> para ter acesso a essa função.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.