Ir para o conteúdo
rockisforkids

Contar digitos de um inteiro

Mensagens Recomendadas

rockisforkids    0
rockisforkids

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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))

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rockisforkids    0
rockisforkids

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rockisforkids    0
rockisforkids

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
msr    0
msr

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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'.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
QuickFire    0
QuickFire

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade