rockisforkids Posted December 2, 2007 at 11:00 PM Report Share #151865 Posted December 2, 2007 at 11:00 PM 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 Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 2, 2007 at 11:02 PM Report Share #151866 Posted December 2, 2007 at 11:02 PM Na Matemática temos o logaritmo de base 10. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
rockisforkids Posted December 2, 2007 at 11:52 PM Author Report Share #151875 Posted December 2, 2007 at 11:52 PM Podes ser um pouco mais específico? De que modo é que o logaritmo me poderá ajudar? (e qual é a funcao em concreto?) Link to comment Share on other sites More sharing options...
Triton Posted December 3, 2007 at 12:06 AM Report Share #151877 Posted December 3, 2007 at 12:06 AM 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. <3 life Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 3, 2007 at 10:47 AM Report Share #151908 Posted December 3, 2007 at 10:47 AM 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)) Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
rockisforkids Posted December 4, 2007 at 06:01 PM Author Report Share #152273 Posted December 4, 2007 at 06:01 PM 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? Link to comment Share on other sites More sharing options...
rockisforkids Posted December 4, 2007 at 06:12 PM Author Report Share #152279 Posted December 4, 2007 at 06:12 PM Descobri agora que o problema está na ATOI ? Tendo eu a string "012345678" a senhora dona função ATOI converte-me isto para um inteiro 12345678 (sem o 0 portanto). Alguma sugestao? Link to comment Share on other sites More sharing options...
Triton Posted December 4, 2007 at 06:23 PM Report Share #152282 Posted December 4, 2007 at 06:23 PM 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. <3 life Link to comment Share on other sites More sharing options...
mogers Posted December 4, 2007 at 08:02 PM Report Share #152321 Posted December 4, 2007 at 08:02 PM 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... "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 4, 2007 at 09:30 PM Report Share #152340 Posted December 4, 2007 at 09:30 PM 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... Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
TheDark Posted December 5, 2007 at 03:53 AM Report Share #152378 Posted December 5, 2007 at 03:53 AM Mas é de facto a mais óbvia 😄 Desaparecido. Link to comment Share on other sites More sharing options...
msr Posted December 21, 2007 at 10:50 PM Report Share #155663 Posted December 21, 2007 at 10:50 PM 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) COMPONENT ORGANIZER easily organize your electronic parts and application notes Link to comment Share on other sites More sharing options...
TheDark Posted December 22, 2007 at 01:11 AM Report Share #155684 Posted December 22, 2007 at 01:11 AM 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'. Desaparecido. Link to comment Share on other sites More sharing options...
QuickFire Posted December 22, 2007 at 01:24 AM Report Share #155686 Posted December 22, 2007 at 01:24 AM 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 ? 😛 Link to comment Share on other sites More sharing options...
mogers Posted December 22, 2007 at 01:35 AM Report Share #155687 Posted December 22, 2007 at 01:35 AM 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. "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now