• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rockisforkids

Contar digitos de um inteiro

15 mensagens neste tópico

Olá,

Fiz uma breve pesquisa no google mas nao consegui encontrar nada...

Alguem me sabe dizer se existe alguma função em C que conte o número de dígitos que um inteiro tem?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes ser um pouco mais específico?

De que modo é que o logaritmo me poderá ajudar? (e qual é a funcao em concreto?)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes usar a função itoa (converte um integer para uma string) seguido de um strlen.

Este método não deve ser o mais eficiente, e atenção que a função itoa não faz parte da standard C library.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes ser um pouco mais específico?

De que modo é que o logaritmo me poderá ajudar? (e qual é a funcao em concreto?)

ceil(log10(n+1))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Rui Carlos ainda nao percebi a tua ideia.

Num forum estrangeiro acabei por descobrir que ha quem faça recurso ha funcao sprintf().

A funçao que arranjei foi a seguinte:

int countDigits(int inteiro,int max){

  char *string;

  string = (char *) calloc(max+1,sizeof(char));
  sprintf(string,"%d",inteiro);

  return strlen(string);
}

No entanto quando o primeiro digito de "inteiro" é 0, esta função não o conta. Conseguem perceber porque?

Sugeririam outro processo para fazer esta conversão?

Edit:

Triton nao consegui usar a itoa() precisamente por nao ser ANSI. Nem posso usar, no trabalho em que estou a fazer. Just ANSI! Conheces outro processo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Descobri agora que o problema está na ATOI  :thumbdown:

Tendo eu a string "012345678" a senhora dona função ATOI converte-me isto para um inteiro 12345678 (sem o 0 portanto).

Alguma sugestao?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No entanto quando o primeiro digito de "inteiro" é 0, esta função não o conta. Conseguem perceber porque?

Zeros à esquerda não têm qualquer significado, 100 ou 0100 significam o mesmo valor, pelo menos em base 10.

Sugeririam outro processo para fazer esta conversão?

O processo que o Rui Carlos apresentou é o mais simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Triton tem razão, o zero à esquerda nao faz sentido nenhum... se a tua função recebe um int "inteiro", este nunca vai ter um 0 à esquerda ao passares para uma string com o sprintf.

Para além das soluções apresentadas, tens sempre a solução (para mim) mais óbvia: ir dividindo o numero por 10 enquando o numero é maior que 0...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para além das soluções apresentadas, tens sempre a solução (para mim) mais óbvia: ir dividindo o numero por 10 enquando o numero é maior que 0...

Isso é calcular o logaritmo à mão...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem la voltar a este assunto.. Pensei que ja tivesse corrigido este problema mas afinal não. Aqui vai uma descrição mais pormenorizada do meu problema:

O programa pede um numero de contribuinte (9 digitos). Qualquer coisa que o user escreva é guardado numa STRING.

Pegando nessa string, tenho de ver se o user se limitou a introduzir o numero de contribuinte ou introduziu tambem coisas indevidas (isto é, o programa tem de ser robusto).

Eu tenho que guardar o numero de contribuinte num vector de inteiros (ja que se tivesse apenas um inteiro nao poderia ter números de contrinuinte a começar por zero).

A minha duvida esta em saber como é que analiso caracter a caracter da string, ver se é um numero ou uma letra/espaco e só se for numero copia-lo para o vector de inteiros. O problema é que o atoi() trabalha melhor com strings do que caracteres, parando assim que encontra uma letra. Se fizer i = atoi©, sendo c='k' (por ex) e i um inteiro, i fica com o valor 0, o que é indesejável neste caso.

Isto parecia-me linear, mas ainda nao consegui resolver o problema e esta-me a fazer confusao...

Têm alguma sugestao?

Edit:

A hipotese do logaritmo funcionaria se tivesse logo de início um numero inteiro. Certo? (ia obtendo as suas casas decimais)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se estás a guardar numa string (char *), é questão de fazeres um ciclo que percorra todos os caracteres e verifique se todos são >= '0' e <= '9'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem la voltar a este assunto.. Pensei que ja tivesse corrigido este problema mas afinal não. Aqui vai uma descrição mais pormenorizada do meu problema:

O programa pede um numero de contribuinte (9 digitos). Qualquer coisa que o user escreva é guardado numa STRING.

Pegando nessa string, tenho de ver se o user se limitou a introduzir o numero de contribuinte ou introduziu tambem coisas indevidas (isto é, o programa tem de ser robusto).

Eu tenho que guardar o numero de contribuinte num vector de inteiros (ja que se tivesse apenas um inteiro nao poderia ter números de contrinuinte a começar por zero).

A minha duvida esta em saber como é que analiso caracter a caracter da string, ver se é um numero ou uma letra/espaco e só se for numero copia-lo para o vector de inteiros. O problema é que o atoi() trabalha melhor com strings do que caracteres, parando assim que encontra uma letra. Se fizer i = atoi©, sendo c='k' (por ex) e i um inteiro, i fica com o valor 0, o que é indesejável neste caso.

Isto parecia-me linear, mas ainda nao consegui resolver o problema e esta-me a fazer confusao...

Têm alguma sugestao?

Edit:

A hipotese do logaritmo funcionaria se tivesse logo de início um numero inteiro. Certo? (ia obtendo as suas casas decimais)

Tu por acaso não andas no técnico não ? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem la voltar a este assunto.. Pensei que ja tivesse corrigido este problema mas afinal não. Aqui vai uma descrição mais pormenorizada do meu problema:

O programa pede um numero de contribuinte (9 digitos). Qualquer coisa que o user escreva é guardado numa STRING.

Pegando nessa string, tenho de ver se o user se limitou a introduzir o numero de contribuinte ou introduziu tambem coisas indevidas (isto é, o programa tem de ser robusto).

Eu tenho que guardar o numero de contribuinte num vector de inteiros (ja que se tivesse apenas um inteiro nao poderia ter números de contrinuinte a começar por zero).

A minha duvida esta em saber como é que analiso caracter a caracter da string, ver se é um numero ou uma letra/espaco e só se for numero copia-lo para o vector de inteiros. O problema é que o atoi() trabalha melhor com strings do que caracteres, parando assim que encontra uma letra. Se fizer i = atoi©, sendo c='k' (por ex) e i um inteiro, i fica com o valor 0, o que é indesejável neste caso.

Isto parecia-me linear, mas ainda nao consegui resolver o problema e esta-me a fazer confusao...

Têm alguma sugestao?

Edit:

A hipotese do logaritmo funcionaria se tivesse logo de início um numero inteiro. Certo? (ia obtendo as suas casas decimais)

Quanto a mim, o TheDark já te deu a resposta para validar o número, mas tem cuidado com o atoi porque no caso de teres um número inserido com 10 ou mais digitos (que por si só não é aceite, visto que queres números com 9 digitos), pode exceder a gama do int e dar overflow.

0

Partilhar esta mensagem


Link 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