kodiak Posted May 10, 2012 at 09:39 AM Report #454219 Posted May 10, 2012 at 09:39 AM 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.
Dulthis Posted May 10, 2012 at 09:55 AM Report #454222 Posted May 10, 2012 at 09:55 AM Já experimentas-te com o Switch ?
kodiak Posted May 10, 2012 at 10:03 AM Author Report #454228 Posted May 10, 2012 at 10:03 AM Olá. Primeiro preciso de validar o input. Caso passe a validação, só depois é que vai para o switch. kodiak
HappyHippyHippo Posted May 10, 2012 at 10:51 AM Report #454248 Posted May 10, 2012 at 10:51 AM char buffer[256]; int valor; ... /* ler input */ fgets(buffer, 256, stdin); /* verificar input */ if (sscanf(buffer, "%d", &valor) != 1) { /* valor inválido */ } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
kodiak Posted May 10, 2012 at 10:54 AM Author Report #454252 Posted May 10, 2012 at 10:54 AM 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
pmg Posted May 10, 2012 at 11:00 AM Report #454253 Posted May 10, 2012 at 11:00 AM 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!
kodiak Posted May 10, 2012 at 11:41 AM Author Report #454279 Posted May 10, 2012 at 11:41 AM 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
Addax Posted May 10, 2012 at 11:50 AM Report #454281 Posted May 10, 2012 at 11:50 AM 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"); }
pmg Posted May 10, 2012 at 12:28 PM Report #454294 Posted May 10, 2012 at 12:28 PM (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 May 14, 2012 at 09:32 AM 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!
kodiak Posted May 10, 2012 at 02:00 PM Author Report #454322 Posted May 10, 2012 at 02:00 PM 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
HappyHippyHippo Posted May 10, 2012 at 02:02 PM Report #454323 Posted May 10, 2012 at 02:02 PM o pmg disse para fazeres isso para saber o que acontece ... visto não referires absolutamente mais nada senão que : não funciona IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
kodiak Posted May 10, 2012 at 02:03 PM Author Report #454326 Posted May 10, 2012 at 02:03 PM 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...
HappyHippyHippo Posted May 10, 2012 at 02:05 PM Report #454328 Posted May 10, 2012 at 02:05 PM 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. podes dizer o que está a acontecer para dizeres que está errado ?? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
kodiak Posted May 10, 2012 at 02:10 PM Author Report #454330 Posted May 10, 2012 at 02:10 PM 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.
kodiak Posted May 10, 2012 at 02:24 PM Author Report #454340 Posted May 10, 2012 at 02:24 PM 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 😄
bsccara Posted May 10, 2012 at 02:40 PM Report #454348 Posted May 10, 2012 at 02:40 PM 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'
HappyHippyHippo Posted May 10, 2012 at 02:41 PM Report #454351 Posted May 10, 2012 at 02:41 PM 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 Portugol Plus
kodiak Posted May 10, 2012 at 02:43 PM Author Report #454353 Posted May 10, 2012 at 02:43 PM -!#$%& caneco. vi scanf em vez do sscanf. Obrigado pela ajuda. Assim já faz sentido. kodiak
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now