Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

sfabiocruz

[Dúvida] Do While isdigit

Mensagens Recomendadas

sfabiocruz

Boa Noite,

Estou com uma dúvida básica que não consigo resolver.

quero que o meu programa continue a pedir por um numero em quanto o utilizador não introduzir um inteiro. ou seja se ele introduzir um caracter tem de voltar a pedir.

eu tenho este código, o problema é que ele entra num loop a apresentar a mesma frase.

int main()
{
int b;

do{
printf("introduz:");
scanf("%d",b);
}while(!isdigit(b));
}

por mais voltas que dê não consigo perceber o que está a faltar.

cumprimentos

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

A função isdigit verifica se um caracter representa um dígito. Portanto, não funciona com números inteiros per se.

No teu caso, se b=4, a função isdigit vai verificar se o caracter ASCII com ordem #4 é um dígito, e vai concluir que não é.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sfabiocruz

Sabes então como faço um ciclo para pedir um inteiro se o utilizador introduzir um caracter em vez de um numero?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Há várias formas de o fazer.

Esta é uma delas:

int getint(int *n) {
  int count=0;
  scanf("%d", n);
  while (getchar() != '\n') count++;
  return count == 0;
}

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Esta é uma delas:

tens de deixar de responder a tópicos às 0:44 da matina ... isso dá sono ... já não tens idade para isso.

olha que o código que tens é para ler um inteiro com limpeza do buffer de entrada, e não :

Sabes então como faço um ciclo para pedir um inteiro se o utilizador introduzir um caracter em vez de um numero?

o que ele pretende seria algo como :

int num, ok = 0;
do {
 // pedir
 printf("Insere um numero : ");
 fflush(stdout);

 // ler
 ok = scanf(" %d", &num);

 // limpeza do buffer de entrada
 while (getchar() != '\n') /* void */;
} while (!ok);


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

@Happy, não te preocupes que, para as rugas, eu meto um daqueles cremes milagrosos cheios de magia de rejuvenescimento :D

Eu reparei que o OP referia um ciclo, mas também me centrei nesta parte:

ou seja se ele introduzir um caracter tem de voltar a pedir.

O scanf vai devolver 1 se o utilizador introduzir qualquer coisa como "123abc" - num passa a ter 123 e depois limpa-se o buffer.

Eu assumi que o "abc" deveria ser detectado e emitir um erro porque "123abc" não é um número.

Em ciclo, ficaríamos com:

int main(void) {
  int num, ok=0;

  do {
     ok = getint(&num);
     if (!ok) printf("Ouça lá, isso é um número inteiro?\n");
  } while (!ok);

  return 0;
}

Diria que o OP já tem duas opções, uma que não admite caracteres não numéricos e outro que os admite a posteriori e exclui.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

sfabiocruz Oi

@sfabiocruz o pesoal apresentou solucoes validas para o problema que mostraste, no

entanto a listagem de codigo que apresentaste contem dois erros:

- O primeiro estas a omitir as directivas de include para as funcoes do biblioteca

standard, podes resolver esse problema atraves de :

#include <stdio.h> /* printf() e scanf()*/
#include <ctype.h> /* para isdigit() */
ou ainda fazendo algo como :
int printf(const char*, ...);

int isdigit(int);
ou seja forneces os prototipos das funcoes que vais chamar assim o compilador

sabera quais as funcoes estas a chamar e ira procura-los na libc, pois a esta e

utilizada por omissao pelo teu linker.

O segundo erro que tas a cometer e de nao passar um ponteiro para a funcao

scanf, e resolves esse erro assim :

scanf("%d", &b);
A funcao scanf tem uma peculiaridade de retornar dos dados lidos o numero

desses que foram convertidos de acordo com o formato passado como primeiro argumento

da funcao. Assim a escusas-te de utilizar a funcao isdigit, segue o exemplo

que o pessoal mostrou, mas se quiseres seguir o mesmo raciocinio que paraces mostrar

no teu exemplo podes fazer algo como:

#include<stdio.h>
#include <ctype.h>

int main(void) {

int chr = '\0';

do {
printf("Introduza um carater : ");
chr = getchar();

} while (!isdigit(chr));

return 0;
}
Edit : alterei as tags.

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.