Validação de dados do tipo INT

1. Validação de dados do tipo INT

Fernando
bellun

(usa Outra)

Enviado em 07/08/2015 - 14:45h

Bom minha dúvida é : Minha dúvida é a seguinte estou tentando validar um campo em C para aceitar somente dados do tipo int, porém os dois tipos de validação tem uma falha.
a validação só funciona para o primeiro caractere que eu insiro, por exemplo se eu insiro 'a' ou 9, agora se eu insiro em um campo de int 9a fura minha validação.E também gostaria de perguntar como eu faria uma validação para que o usuário não insira um numero que seja maior que uma var do tipo int aceite, assim evitando o overflow.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main ()
{

// Declaracoes
int num,ret;
// Instrucoes
printf("insira um numero:\n");
fflush(stdin);
ret=scanf("%d",&num);
fflush(stdin);
while(ret==0 ||isdigit(num))
{
printf("%cCampo destinado para numeros, insira novamente:\n",7);
fflush(stdin);
ret=scanf("%d",&num);
fflush(stdin);
}
return 0;
}




  


2. Re: Validação de dados do tipo INT

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 07/08/2015 - 18:39h

É bem simples.

O Scanf retorna 0 (zero) quando o que foi digitado é invalido (letra, e se passar do valor máximo, ele já mostra também)

Com isso é só fazer um loop e usar o getchar para "limpar" o buffer;

Nota: Eu particularmente não recomendo o uso do fflush. Procure alguma outra alternativa. Eu sempre usei o getchar() e funcionou perfeitamente no Linux e no Windows

Espero ter ajudado

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"




3. Re: Validação de dados do tipo INT

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/08/2015 - 18:58h

O jeito “fácil” é ler a linha inteira, e depois ver se a linha toda comporta somente um valor inteiro.

char line[MAX_LINE_SIZE];
int value, line_len, bytes_used;

/* ... */

if(fgets(line, MAX_LINE_SIZE, stdin)==NULL){
fprintf(
stderr, "Leitura interrompida: %s.\n",
feof(stdin)? "fim de arquivo": "erro de leitura"
);
exit(1);
}
else if( (line_len=strlen(line))==MAX_LINE_SIZE && line[line_len-1]!='\n' ){
fprintf(stderr, "Leitura truncada (linha longa demais).\n");
exit(1);
}
else if(
/*
A primeira linha do bloco de condições abaixo é para evitar aceitar
espaços em branco, o que a conversão "%d" de scanf() e suas
irmãs permitiria.
*/
(!isdigit(line[0]) && line[0]!='-' && line[0]!='+') ||
sscanf(line, "%d%n", &value, &bytes_used)!=1 ||
bytes_used!=line_len
){
fprintf(stderr, "Formato inválido.\n");
exit(1);
}
else if(value<MINIMUM_VALUE || value>MAXIMUM_VALUE){
fprintf(stderr, "Valor fora da faixa aceitável.\n");
exit(1);
}
// Neste ponto, você tem um valor válido.



4. Re: Validação de dados do tipo INT

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/08/2015 - 19:18h

Outro jeito de fazer, talvez mais simples, seria o seguinte.

int value;
int before, after, garbage;

after=before=garbage=0;
if(
scanf(" %n%d%n%*[^\n]%1*[\n]%n", &before, &value, &after, &garbage)!=1 || // Não há numero
before!=0 || // Há espaços no início da linha?
garbage-after>1 || // Há outros caracteres entre o número e o '\n'?
){
// Formato inválido, por uma das razões acima.
if(after==0 || garbage==0){
// Há caracteres no buffer que não são algarismos nem espaços.
if(!feof(stdin)){
/*
O scanf() abaixo está dentro de um if porque alguns ambientes
de compilação, como o do Ubuntu, reclamam de se ignorar o valor
de retorno de scanf(). Deste jeito, eu não o ignoro diretamente,
mas também não tomo nenhuma atitude a seu respeito.
*/
if(scanf("%*[^\n]%*1[\n]")) // Ignora tudo até o fim da linha.
;
}
}
}
else{
// Aqui você tem um valor válido em "value".
}


Esse bloco ainda tem um problema: se você digitar só ENTER (ou intercalações contendo somente espaços e ENTERs), a scanf() vai ficar esperando pelo primeiro caráter de outro tipo, sem devolver o controle ao programa. Uma solução melhor talvez envolvesse primeiro um getchar() potencialmente seguido por ungetc(), mas eu tenho de sair agora e não dá para elaborar tal solução. Se o Thihup quiser tentar...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts