Jump to content
Nuno_Fonseca

Validar se é um número

Recommended Posts

Nuno_Fonseca

Boas, gostava de saber como impedir que o o programa dê erro, quando o utilizador insere uma letra/palavra, quando deveria inserir um numero, quando o programa é executado.

Aqui em baixo tem um programa exemplo (inacabado), e gostava de saber então o que tenho de inserir para esse erro nao acontecer:

#include<stdio.h>

main()
{ int numero,digito,r,i=1,digito1,digito2,resultado;
  char L;   

  printf("A Tabuada\n");
  printf("Queres saber a Tabuada de que Numero? (limite +- 200000000)\n");
  scanf("%d",&numero);
  while(!(numero<200000000&&numero>-200000000))
  {printf("Numero com tamanho invalido\n");
   printf("Digite de novo\n");
   scanf("%d",&numero);
}
   
  printf("Queres saber do 1 ate quanto?\n");
  scanf("%d",&digito);
  while(i<=digito)
  {
    r = numero*i;
    printf("\n%d x %d = %d\n",numero,i,r);
    i++;
  } 
  
  printf("\nQueres saber o produto de uma multiplicacao especifica?\n");
  printf("Se sim, entao prime \"s\" ou \"S\" senao prime qual tecla\n");
  scanf("%s",&L);
  if ( L == 's' || L == 'S')
  {
  printf("Qual o primeiro digito?\n");
  scanf("%d",&digito1);
  printf("Qual o segundo digito?\n");
  scanf("%d",&digito2);
  resultado = digito1 * digito2;
  printf("O resultado da multiplicaçao entre os dois numeros e %d\n",resultado);
  }
  
  
  
    
  system("pause");     
}

Ao pesquisar na Internet li funções do tipo IsNumeric ou isdigit, mas nunca ouvi falar nem sei se é usado em C ( sou novo a programar).

Agradecia a ajuda.

Share this post


Link to post
Share on other sites
skinie18

Eu ja falei disso mas nao estou muito dentro do assunto, mas faz assim a variavel que queres verificar imaginemos que é "number".

int number;

se fizeres:

printf("%d", scanf("%d", &number));

ele devolve 0 se number for do tipo que foi declarado, e outro valor qualquer se o number foi difrente da tipo declarado.

Mas pesquisa e verifica este metodo.

Verifica tambem se nao há um mais simples.

Share this post


Link to post
Share on other sites
faria

olá malta, eu estou com o mesmo problema referido pelo Nuno Fonseca,

se alguém me poder ajudar agradeço.

cumps

GF

Share this post


Link to post
Share on other sites
daj

Em http://linux.die.net/man/3/scanf

Return Value

These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.

Ou seja, o scanf devolve o número de associações feitas com sucesso:

int res, i;
char c;

res = scanf("%c%d", &i, &c);

res será 2 se o utilizador escrever um carácter seguido de um inteiro (ex: com a12, c = 'a' e i = 12), será 1 se o utilizador escrever apenas um carácter, ou um carácter seguido de algo que não é um inteiro (ex: com aa, c = 'a') e será 0 se não tiverem sido feitas associações.

No teu caso, o retorno do scanf será 0 para o caso se não ter sido lido um inteiro para "numero" ou 1 no caso contrário. Podes ter em conta esse valor para saber se foi lido um número.

res = scanf("%d", &numero);
if (res != 1) return;

Já agora, o facto do scanf ler um número para "numero" não significa que tenha consumido todo o input do utilizador. Por exemplo, se o utilizador escrever "12abc<enter>", numero fica com o valor 12 e "abc<enter>" fica para ser consumido pelo próximo scanf. Daí a diferença entre estas duas execuções:

A Tabuada
Queres saber a Tabuada de que Numero? (limite +- 200000000)
abc

A Tabuada
Queres saber a Tabuada de que Numero? (limite +- 200000000)
12abc
Queres saber do 1 ate quanto?

No segundo caso, só o scanf para digito consumiu o "abc<enter>" que se tinha introduzido antes.

Já agora, em

scanf("%s",&L);

tu queres é ler um carácter (%c) e não uma string (%s). Como está, tens uma vulnerabilidade de buffer overflow. Experimenta digitar uma sequência grande de caracteres para veres o programa a rebentar:

A Tabuada
Queres saber a Tabuada de que Numero? (limite +- 200000000)
2
Queres saber do 1 ate quanto?
2

2 x 1 = 2

2 x 2 = 4

Queres saber o produto de uma multiplicacao especifica?
Se sim, entao prime "s" ou "S" senao prime qual tecla
addajasdjsadjkasdkkajsdkjasjdjasdjksjkadkjsakjds

Share this post


Link to post
Share on other sites
bubulindo

Procura pela ctype.h. Normalmente tem lá as funções do género is*****() para testar se é um número ou não.

Senão podes sempre converter para string e garantir que o que leste é um número, ou seja, que todos os elementos da string são digitos numéricos. :)


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites

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.