Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bob Bruno

Retirar Zero a Direita

Recommended Posts

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

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

Você escreveu que quer remover a direita, só que no exemplo você demostra

Valor:123450000

Logo 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

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.

 

LOL

Respondi 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

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

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

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

#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

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

#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

 

#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

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

_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

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

_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

 

_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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.