Remover caracteres de uma string [RESOLVIDO]

1. Remover caracteres de uma string [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 28/04/2015 - 10:38h

E ae galera (sou eu denovo, só sei perguntar, né)?

Estou escrevendo um algoritmo que vai receber um valor de um caminho, vamos supor que seja res/ar.png.
E eu preciso remover os caracteres antes e o prório '/'. E depois converter para c_str().

Eu já fiz algumas tentativas, mas nenhuma delas deu certo.

Segue um esboço:


char *removeElementos(std::string x){
int begin = x.find_last_of('/');
if(begin == -1)
begin = 0;
std::string teste = x.substr(begin);
char * array = teste.c_str();
return array;
}


Alguem poderia me ajudar?

Grato
Thiago


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/04/2015 - 20:10h

Thihup escreveu:

char *removeElementos(std::string x){
int begin = x.find_last_of('/');
if(begin == -1)
begin = 0;
std::string teste = x.substr(begin);
char * array = teste.c_str();
return array;
}


Alguem poderia me ajudar?


Por que você quer retornar string no estilo C?

O erro no código acima é que teste é um objeto local, que deixa de ser válido quando a função termina, e a função std::string::c_str() aponta para dados internos do objeto que a invoca. Na prática, o que você faz é retornar um ponteiro para objeto temporário local, um erro clássico, análogo aos seguintes.

int *bad_func_int(int x){
int y=2*x;
return &y; /* Oops! retorna endereço de objeto temporário. */
}

char *bad_func_array(int x){
char array[10];
snprintf(array, sizeof array, "%d", 2*x);
return array; /* Oops! retorna endereço de objeto temporário. */
}


Minha sugestão é que você trabalhe consistentemente apenas com std::string.

std::string basename(const std::string &x){
return x.substr(x.find_last_of('/')+1);
}


Se você precisar que seja uma string ao estilo do C, pode, em alguns contextos, usar algo como basename(str).c_str(). Veja.

// Usa a função basename() mostrada acima.
std::string filename;

/* ... */

// Uso OK, pois o objeto temporário vale durante todo o
// escopo da chamada do construtor de input_file.
std::ifstream input_file(basename(filename).c_str(), ios::binary);

// Uso errôneo: basename() retorna um objeto temporário,
// mas o tempo de vida do ponteiro pcc é maior do que o do
// objeto. Assim que chega ao ponto-e-vírgula, pcc já está
// apontando para um dado inválido.
const char *pcc=basename(filename).c_str;


Se você tiver de retornar diretamente um ponteiro para caráter, pode fazer o seguinte.

// Note que o ponteiro tem de ser para const char,
// para ninguém tentar manipular os dados que são
// do próprio objeto passado à função por referência.
const char *basename(const std::string &x){
return x.c_str()+x.find_last_of('/')+1;
}


Eis exemplos de uso.

// Usa a versão C-string de basename().
std::string str;
const char *pcc;

/* ... */

pcc=basename(str);
// pcc aponta para dentro da própria string contida em str.
// Esse apontamento permanecerá válido enquanto o valor
// de str não for alterado.


3. Re: Remover caracteres de uma string [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 28/04/2015 - 18:23h

Então, eu consegui resolver esse problema, mas estou com outro :

Aparentemente está chamando o Destrutor da função já no inicio, sendo que em nenhum "momento" uso por exemplo, um delete.
(Não tenho certeza, mas pelos meus testes não é chamada o construtor).

Vou tentando aqui, se tiver alguma sugestão[...]


[]'s

T+


4. Re: Remover caracteres de uma string

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/04/2015 - 21:34h

Thihup escreveu:

Então, eu consegui resolver esse problema, mas estou com outro :

Aparentemente está chamando o Destrutor da função já no inicio, sendo que em nenhum "momento" uso por exemplo, um delete.


Cuidado com a terminologia. “Destrutor da função” não faz muito sentido (a não ser que você esteja falando de um objeto-função, também chamado “functor”, que é um objeto de uma classe com sobrecarga do operador (), de invocação de função). Você se refere ao destrutor de algum objeto declarado dentro da função, certo? Sendo esse o caso, seria interessante você mostrar a nova forma que a função assumiu, depois das modificações que você provavelmente fez depois da primeira mensagem (uma vez que disse que conseguiu resolver o problema inicial).

Na sua primeira postagem, você declarou diretamente um objeto teste dentro da função. Esse objeto é alocado na pilha, e construído nesse espaço. Quando ele sai do escopo, ele é automaticamente destruído e o espaço da pilha é liberado. O compilador se encarrega disso para você, a fim de que, na medida do possível, o tipo desse objeto (sua classe) se comporte do modo mais parecido possível com tipos nativos (e.g. quando você declara uma variável local do tipo int ou double, a declaração já é uma instrução de reserva de espaço, e você também não se preocupa em liberar explicitamente o espaço dessa variável, pois sabe que ele será liberado quando a variável sair de escopo).

Você só teria de chamar explicitamente delete sobre um ponteiro que tivesse sido alocado por meio de new, e essa alocação teria provavelmente sido feita não na pilha, mas sim na memória livre (free store, muitas vezes chamada também de heap), que não tem nenhuma relação com limites de blocos ou funções.

(Não tenho certeza, mas pelos meus testes não é chamada o construtor).


De qual objeto? De que tipo? std::string? Se for std::string, sempre existe um construtor sendo chamado, pois a implementação garante isso (a não ser que você faça algum truque de baixo nível, que eu creio que não é o caso).

De todo modo, não existe relação necessária entre a invocação do destrutor com um dos construtores. Uma classe pode ter vários tipos de construtores, e qual deles será chamado -- se é que algum o será -- depende de como você pedir para criar um objeto dessa classe. Já destrutor, pode haver no máximo um; se ele existir, ele sempre será chamado no momento em que o objeto for destruído.


5. Re: Remover caracteres de uma string [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 28/04/2015 - 22:45h

E ae Paulo, me desculpe pelos erros , mas é que eu estou fazendo um carregador de imagem usando o SDL para um projeto que vou implementar com ele.

E o código é meio grande e são 5 arquivos, se quiser, posso mandar um e-mail para você.

[]'s

T+


6. Re: Remover caracteres de uma string

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/04/2015 - 23:07h

Editei minha primeira resposta provavelmente ao mesmo tempo em que você escreveu sua última mensagem. Se puder, veja os exemplos que adicionei a ela. Espero que ajudem a esclarecer sua dúvida.

De todo modo, não tem de pedir desculpas a mim por erro nenhum. Eu estou tentando ser didático, não esculhambar ninguém.

E eu também não quero o código todo. Só os pedaços relevantes para a questão que você indagou.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts