Bob Bruno 0 Denunciar post Postado Agosto 26, 2010 Pessoal, É o seguinte, preciso criar uma função em "C", que retire todos os ZEROS a ESQUERDA de um CHAR (no titulo do topico coloquei a direita, mas é a esquerda). Exemplo: Valor: 00000123450000 Preciso criar uma função que retire os zeros iniciais dessa variável "Valor". Preciso que essa variável fique com o seguinte resultado: Valor:123450000 Alguem pode me ajudar? Lembrando que minha variável VALOR sempre é do tamanho CHAR[14]. Grato. Compartilhar este post Link para o post Compartilhar em outros sites
Daniloinf 3 Denunciar post Postado Agosto 26, 2010 Uma maneira simples mas não muito genérica é transformar esta string em um número ponto flutuante: $num = '000123456789'; echo $num; echo '<br/>'; $num = (float) $num; echo $num; Essa idéia falha quando o número original tem mais de 14 algarismos, ai eu acho que é melhor procurar os 0's a esquerda manualmente e remove-los. Compartilhar este post Link para o post Compartilhar em outros sites
cpplove 0 Denunciar post Postado Agosto 26, 2010 Você escreveu que quer remover a direita, só que no exemplo você demostra Valor:123450000Logo acredito que você queira remover os zeros da ESQUERDA..caso seja isto mesmo, segue o codigo abaixo: char valor[] = "00000123450000"; char *valor2; int rpos = 0; bool found = false; for( int i=0; i < strlen(valor); i++ ) { if( valor[i] != '0' && !found) { found = true; valor2 = new char[strlen(valor)-i]; } if( found ) valor2[rpos++] = valor[i]; } Compartilhar este post Link para o post Compartilhar em outros sites
Daniloinf 3 Denunciar post Postado Agosto 26, 2010 Uma maneira simples mas não muito genérica é transformar esta string em um número ponto flutuante: $num = '000123456789'; echo $num; echo '<br/>'; $num = (float) $num; echo $num; Essa idéia falha quando o número original tem mais de 14 algarismos, ai eu acho que é melhor procurar os 0's a esquerda manualmente e remove-los. LOLRespondi em php, confundi os fóruns aqui, malzao em... 0.o" Me redimindo, aqui vai uma versão bem simples usando ponteiros: #include<stdio.h> int main(){ char a[] = "0000123"; char *new; new = a; while((char) *new == '0'){ new++; } printf("%s\n", new); } Compartilhar este post Link para o post Compartilhar em outros sites
Bob Bruno 0 Denunciar post Postado Agosto 26, 2010 CPPLOVE, É isso mesmo, eu escrevi à direita, mas o correto seria A ESQUERDA. Eu não entendi qual seria a saída desse código que você escreveu. A minha varíavel "VALOR" estaria com o valor correto (sem os zeros) ? É que testei e não funcionou :( Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Agosto 26, 2010 tanto nome pra dar variaveis você da logo 'new' FUDHSAUFHASDU.. só mudar o nome da variável q roda kk []s Compartilhar este post Link para o post Compartilhar em outros sites
Daniloinf 3 Denunciar post Postado Agosto 26, 2010 tanto nome pra dar variaveis você da logo 'new' FUDHSAUFHASDU.. só mudar o nome da variável q roda kk []s KKKkkkK, combo miss pra mim o/ Mas se rodar em C da certo, é porque new é palavra reservado só em c++ Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Agosto 27, 2010 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char * num = "000000000000000000001234"; char newNum[255]; sprintf(newNum, "%lf", strtod(num, &num+strlen(num)-1)); printf("%s\n", newNum); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Brain_Storm 0 Denunciar post Postado Agosto 27, 2010 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char* num = "000000000000000000001234"; while(*num=='0') num++; printf("%s\n", num); return 0; } É mais rápido. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Agosto 27, 2010 KKKkkkK, combo miss pra mim o/ Mas se rodar em C da certo, é porque new é palavra reservado só em c++ kkk ata disfarça pq eu rodei em ele como .cpp msm ;D []s Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Agosto 27, 2010 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char* num = "000000000000000000001234"; while(*num=='0') num++; printf("%s\n", num); return 0; } É mais rápido. Pode até ser mais rápido, mas não retira os zeros do char *, simplesmente imprime sem os zeros, o que não é exatamente o que ele quer: É o seguinte, preciso criar uma função em "C", que retire todos os ZEROS a ESQUERDA de um CHAR (no titulo do topico coloquei a direita, mas é a esquerda). Exemplo: Valor: 00000123450000 Preciso criar uma função que retire os zeros iniciais dessa variável "Valor". Preciso que essa variável fique com o seguinte resultado: Valor:123450000 Compartilhar este post Link para o post Compartilhar em outros sites
Acacio 0 Denunciar post Postado Agosto 31, 2010 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char* num = "000000000000000000001234"; while(*num=='0') num++; printf("%s\n", num); return 0; } É mais rápido. Pode até ser mais rápido, mas não retira os zeros do char *, simplesmente imprime sem os zeros, o que não é exatamente o que ele quer: É o seguinte, preciso criar uma função em "C", que retire todos os ZEROS a ESQUERDA de um CHAR (no titulo do topico coloquei a direita, mas é a esquerda). Exemplo: Valor: 00000123450000 Preciso criar uma função que retire os zeros iniciais dessa variável "Valor". Preciso que essa variável fique com o seguinte resultado: Valor:123450000 Ah _Isis_, Nós sabemos que a solução dele foi melhor, vamos adimitir. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Setembro 1, 2010 Caso o número seja '00000000', a saída com o while é vazia. Caso seja "-0000000001234", a saída continua sendo "-0000000001234". Se fosse p/ armazenar em uma variável, ainda faltaria um passo (a cópia da string). Compartilhar este post Link para o post Compartilhar em outros sites
Acacio 0 Denunciar post Postado Setembro 2, 2010 _Isis_, reconheço sua grande experiência e contribuição à este fórum, reconheço também que você já me ajudou algumas vezes aqui no forum cpp, mas vamos analisar a pergunta do Bob Bruno: "É o seguinte, preciso criar uma função em C, que retire todos os ZEROS a ESQUERDA de um CHAR, de acordo com a necessidade dele não precisaria copiar o resultado para uma nova variável. Outra coisa é que toda referência que for feita a "num" terá o valor sem os zeros, então atende sim as espectativas de Bob Bruno. Sobre o while nao retornar nada concordo com você mas esse é um critério de verificação que Bob Bruno vai corrigir, afinal o aplicativo é dele. Agora referente ao sinal negativo, é muito difícil que ocorra um caso assim "-000000012345", se alguem teve o trabalho de colocar o sinal negativo é claro que nao vai colocar zeros em seguida, e mesmo que ocorra um caso assim então é critério de Bob Bruno corrigir. _Isis_, não quero parecer chato, pois reconheço seu nível de conhecimento, o que apenas quero falar é que a solução abaixo atende a necessidade básica dele. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char* num = "000000000000000000001234"; while(*num=='0') num++; printf("%s\n", num); return 0; } Abraços.. ^_^ Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Setembro 2, 2010 beleza temos 2 códigos ;D um faz o simples o outro está preparado para entradas + inesperadas! []s Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Setembro 5, 2010 _Isis_, reconheço sua grande experiência e contribuição à este fórum, reconheço também que você já me ajudou algumas vezes aqui no forum cpp, mas vamos analisar a pergunta do Bob Bruno: "É o seguinte, preciso criar uma função em C, que retire todos os ZEROS a ESQUERDA de um CHAR, de acordo com a necessidade dele não precisaria copiar o resultado para uma nova variável. Outra coisa é que toda referência que for feita a "num" terá o valor sem os zeros, então atende sim as espectativas de Bob Bruno. Sobre o while nao retornar nada concordo com você mas esse é um critério de verificação que Bob Bruno vai corrigir, afinal o aplicativo é dele. Agora referente ao sinal negativo, é muito difícil que ocorra um caso assim "-000000012345", se alguem teve o trabalho de colocar o sinal negativo é claro que nao vai colocar zeros em seguida, e mesmo que ocorra um caso assim então é critério de Bob Bruno corrigir. _Isis_, não quero parecer chato, pois reconheço seu nível de conhecimento, o que apenas quero falar é que a solução abaixo atende a necessidade básica dele. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char* num = "000000000000000000001234"; while(*num=='0') num++; printf("%s\n", num); return 0; } Abraços.. ^_^ Na verdade, a solução é ruim. O que o/a _Isis_ quis dizer com "a solução não remove os zeros" é que eles ainda ficam na memória. A única coisa que se faz é incrementar o endereço base do ponteiro que armazena a primeira posição do vetor de chars. A solução ideal seria contar até que algo diferente de '0' fosse encontrado (levando em consideração a possibilidade de se ter o char "-" no offset 0), alocar (strlen(num) - contador) bytes e copiar os valores, sem esquecer de chamar free(num) depois. Assim você efetivamente remove os bytes (o que é bem diferente de "escondê-los"). Isso parece bobo, mas se o usuário está aprendendo, é bom que ele saiba que se ele fizer isso com estruturas de dados maiores e mais complexas, estará disperdiçando memória, e portanto a solução dada não é boa. Compartilhar este post Link para o post Compartilhar em outros sites
Acacio 0 Denunciar post Postado Setembro 6, 2010 _Isis_, reconheço sua grande experiência e contribuição à este fórum, reconheço também que você já me ajudou algumas vezes aqui no forum cpp, mas vamos analisar a pergunta do Bob Bruno: "É o seguinte, preciso criar uma função em C, que retire todos os ZEROS a ESQUERDA de um CHAR, de acordo com a necessidade dele não precisaria copiar o resultado para uma nova variável. Outra coisa é que toda referência que for feita a "num" terá o valor sem os zeros, então atende sim as espectativas de Bob Bruno. Sobre o while nao retornar nada concordo com você mas esse é um critério de verificação que Bob Bruno vai corrigir, afinal o aplicativo é dele. Agora referente ao sinal negativo, é muito difícil que ocorra um caso assim "-000000012345", se alguem teve o trabalho de colocar o sinal negativo é claro que nao vai colocar zeros em seguida, e mesmo que ocorra um caso assim então é critério de Bob Bruno corrigir. _Isis_, não quero parecer chato, pois reconheço seu nível de conhecimento, o que apenas quero falar é que a solução abaixo atende a necessidade básica dele. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char* num = "000000000000000000001234"; while(*num=='0') num++; printf("%s\n", num); return 0; } Abraços.. ^_^ Na verdade, a solução é ruim. O que o/a _Isis_ quis dizer com "a solução não remove os zeros" é que eles ainda ficam na memória. A única coisa que se faz é incrementar o endereço base do ponteiro que armazena a primeira posição do vetor de chars. A solução ideal seria contar até que algo diferente de '0' fosse encontrado (levando em consideração a possibilidade de se ter o char "-" no offset 0), alocar (strlen(num) - contador) bytes e copiar os valores, sem esquecer de chamar free(num) depois. Assim você efetivamente remove os bytes (o que é bem diferente de "escondê-los"). Isso parece bobo, mas se o usuário está aprendendo, é bom que ele saiba que se ele fizer isso com estruturas de dados maiores e mais complexas, estará disperdiçando memória, e portanto a solução dada não é boa. :mellow: Gente, o que quero que vcs entendam é que falei que o algopritimo defendido por mim atende às necessidades "BASICAS" de Bob Bruno, concordo que de um modo geral o algoritimo contem uma solução nada aconselhavel, mas atende a necessidade básica dele. vejam o pensamento: "Se o cliente precisa de uma solução simples então farei uma solução simples, mas se ele precisa de um sistema robusto então faço um sistema robusto e livre de erros". Abraços...B) Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Setembro 8, 2010 Não podemos levar isso para o lado de "clientes" porque se for para apresentar uma solução paleativa, pode se preparar com os suportes futuros. + eu entendi oq você disse, para um algoritmo feito em sala de aula está de bom tamanho, com mais tempo ele vai aprendendo coisas mais "sofisticadas" []s Compartilhar este post Link para o post Compartilhar em outros sites