Jump to content

Recommended Posts

Posted

Olá pessoal.

Tenho um código em C que apresenta um menu ao utilizador com as opções 1,2 e 3.

Gostava de saber qual a melhor maneira de validar o input.

Se estiver a usar o scanf e o utilizador apenas inserir números é simples mas se houver um typo ou inserir um caracter dá barraca.

Pelo que vi o gets() não é grande espingarda mas o scanf() tem tb as suas manhas. Há alguma outra função que possa utilizar?

Como em Java temos os blocos try catch pensei que em C também poderia haver algo do género...

Desde já obrigado,

Kodiak.

Posted

char buffer[256];
int valor;
...
/* ler input */
fgets(buffer, 256, stdin);
/* verificar input */
if (sscanf(buffer, "%d", &valor) != 1) {
  /* valor inválido */
}

Ok.

Vou ver se entedo isto e depois se tiver dúvidas passo por aqui.

Obrigado,

kodiak

Posted

Outra hipótese, talvez mais simples, é usar getchar() ...

int ch;
/*...*/
do ch = getchar(); while (ch < '1' || ch > '3');
/*...*/

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Outra hipótese, talvez mais simples, é usar getchar() ...

int ch;
/*...*/
do ch = getchar(); while (ch < '1' || ch > '3');
/*...*/

Uma vez que esta solução era a mais "curta" comecei por esta mas infelizmente não está a funcionar como devia. Esqueci-me de dizer que é ANSI C por isso não sei se faz diferença.

Tenho então o código seguinte:

 

int validaNumeros(char limiteInferior,char limiteSuperior);

int main()
{
    int escolha=-1;

        escolha = validaNumeros('0','3');
        printf("##Escolha %d\n",escolha);


    return 0;
}


int validaNumeros(char limiteInferior,char limiteSuperior){
    int escolha;

    do{
        escolha = getchar();

    }while(escolha < limiteInferior || escolha > limiteSuperior);

    return escolha;
}

Soluções?

kodiak

Posted

eu fazia algo parecido com isto.. é bastante simples

int n;
  printf("Insira o numero\n");
  scanf("%d",&n);
  switch(n)
  {
        case 1: printf("ola 1\n");
                  break;
        case 2: printf("ola 2\n");
                  break;
        case 3: printf("ola 3\n");
                  break;
        default: printf("Incorrecto\n");
  }
Posted (edited)

Soluções?

Imprime o resultado como caracter!

#include <stdio.h>
/* ... */
int main(void) {
 int escolha;
 escolha = validaNumeros('0', '3');
 printf("##Escolha %d (%c)\n", escolha, escolha); /* imprimir como numero (código ASCII)
                                                  ** e caracter */
 return 0;
}
/* ... */
Edited by pmg
GeSHi update

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

eu fazia algo parecido com isto.. é bastante simples

int n;
  printf("Insira o numero\n");
  scanf("%d",&n);
  switch(n)
  {
        case 1: printf("ola 1\n");
                  break;
        case 2: printf("ola 2\n");
                  break;
        case 3: printf("ola 3\n");
                  break;
        default: printf("Incorrecto\n");
  }

Esta maneira mostrou-me como encarar o problema por outro lado contudo não me resolve o problema a 100%.

obrigado,

Imprime o resultado como caracter!

#include <stdio.h>
/* ... */
int main(void) {
  int escolha;
  escolha = validaNumeros('0', '3');
  printf("##Escolha %d (%c)\n", escolha, escolha); /* imprimir como numero (código ASCII)
                                                   ** e caracter */
  return 0;
}
/* ... */

O print era apenas para debug. Como preciso de um inteiro e não de um caracter, tenho, na função validaNumeros, devolver o resultado convertido como um inteiro.

kodiak

Posted

o pmg disse para fazeres isso para saber o que acontece ... visto não referires absolutamente mais nada senão que : não funciona

Posso não me ter feito entender mas o que quis dizer foi que com o que o pmg disse, entendi o que tinha de fazer...

Posted

podes dizer o que está a acontecer para dizeres que está errado ??

Apesar de ter tornado numa função o que o pmg disse, acho que o essencial mantêm-se.

Dentro da função, não está a ser feito o do while, se por exemplo inserir 12, sai logo do do while quando devia ficar em loop até inserir um input válido.

Posted

Com a solução do HHH fiz o seguinte código:

#include <stdio.h>
#include <stdlib.h>

int main(){

    char buffer[256];
    int valor;

    fgets(buffer, 256, stdin);
    /* verificar input */
    if (sscanf(buffer, "%d", &valor) != 1) {
        printf("valor diferente de 1\n");
    }
    else{
        printf("valor igual a 1\n");
    }
    return 0;
}


Se inserir um número, cai sempre dentro do else. Se inserir um caracter, cai dentro do if. Alguma coisa estou a fazer mal 😄

Posted

Se leres a definição da função 'sscanf' (http://pubs.opengroup.org/onlinepubs/9699919799/) verás que o retorno da função é o número de atribuições feitas às variáveis apontadas. '%d' tenta converter para um inteiro, pelo que não aceita letras. Logo se meteres um número o retorno da função será 1 e saltará para o else; se meteres uma letra o retorno será 0 e continuará no if.

O que tens de fazer é verificar se o retorno da função é 1, caso em que o texto convertido representa um número, e depois validar o número através da variável 'valor'

Posted

a função sscanf retorna o número de variável lidas ... logo o teu printf não faz sentido ... deveria ser :

#include <stdio.h>
#include <stdlib.h>

int main(){

    char buffer[256];
    int valor;

    fgets(buffer, 256, stdin);
    /* verificar input */
    if (sscanf(buffer, "%d", &valor) != 1) {
        printf("valor não foi lido correctamente\n");
    }
    else{
        printf("valor lido : %d\n", valor);
    }
    return 0;
}
IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.