função char que retorn uma string sem espaço

1. função char que retorn uma string sem espaço

Igor ten Caten ZAtti
iogrzatti

(usa Outra)

Enviado em 07/05/2018 - 22:51h

char* Agenda::remove_Espaço(char *alterar)
{
char *alterado = alterar;
while(*alterado != '\0')
{
if(alterar[i] == ' ')
alterado[i] = '_';
else alterado[i] = alterar[i];
}
return alterado;
}




  


2. Re: função char que retorn uma string sem espaço

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/05/2018 - 04:55h

O SamL já deu soluções, mas não apontou o que estava errado nem fez outros comentários. Acho útil fazer alguns comentários quanto ao código aqui que possam ajudá-lo em projetos futuros.

iogrzatti escreveu:

char* Agenda::remove_Espaço(char *alterar) 


A função de remoção de espaços é um comportamento intrínseco da classe Agenda, ou é mera função auxiliar, usada para strings que não necessariamente têm a ver com objetos da classe?

Ajuda-nos a responder o exame do parâmetro, que deixa claro que o que a função recebe algo totalmente exterior a classe, e o exame do corpo da função, que não mexe com nenhum campo da classe (a não ser que aquele i que ali aparece seja declarado como membro da classe, mas falo sobre ele mais abaixo).

Uma vez que a função não tem nada a ver com a classe, ela certamente deveria ser tirada de dentro dela.

Lembre-se que C++ não é Java. Nem tudo tem de estar dentro de uma definição de classe para poder existir. Funções que, por sua natureza, não estejam ligadas a objeto nenhum podem e devem ser declaradas como funções em nível de namespace.


Outra crítica, agora quanto à forma, é a seguinte: se a função sempre retorna o mesmo valor que aquele recebido como seu único parâmetro, e não detecta nem sinaliza situações de erro, por que ela devolve um valor do tipo “char *”? Se você não ganha nada com a informação retornada, então a função poderia ter tipo de retorno “void”.

Alternativamente, você poderia verificar se o ponteiro é válido (não-nulo) antes de prosseguir com a execução da função. Nesse caso, um valor de retorno poderia ser adequado, bem como, eventualmente, alterar o valor de errno (em <cerrno> ou <errno.h>), ou você poderia optar por disparar uma exceção.

{
char *alterado = alterar;


Fazendo isso, você faz com que, pelo menos inicialmente, alterar e alterado apontem para o mesmo dado. A curiosidade de que você use nomes diferentes para dois ponteiros que se referem ao mesmo endereço não faz com que haja duas versões de dados nesse endereço.

    while(*alterado !=  '\0') 


Você examina o conteúdo de um ponteiro como condição de controle do laço de repetição, mas não altera, dentro do laço, nem o valor do ponteiro nem o conteúdo do lugar para onde ele aponta. Assim, esse laço de repetição só não será infinito de a função for chamada com uma string vazia.

Ou se corrige o conteúdo do bloco de repetição, ou se muda a condição de controle.

    {
if(alterar[ i] == ' ')
alterado[ i] = '_';
else alterado[ i] = alterar[i ];


De onde surgiu a variável i? Qual seu valor inicial?

Como você não a declarou dentro da função, existem três possibilidades: (1) o código não compila devido à falta da variável, (2) a variável é um membro da classe Agenda, ou (3) a variável está em nível de namespace ou global.

No caso (1), você tem de refazer a função, porque não há como executar um código que nem ao menos compila. Nos outros dois casos, o código poderia compilar, mas ainda seria um provável erro de projeto usar na função um valor que lhe é externo e que tem um tempo de vida maior do que o tempo de sua execução, e com valores fora do seu controle.

Para piorar, você não mexe no valor de i, de modo que o laço de repetição não evolui.

Além disso, você parece estar sempre tentando ler de alterar e gravar em alterado, como se estivesse copiando de uma para a outra. Não será o caso, já que, como mostrado acima, ambas apontam para o mesmo endereço.

    }
return alterado;
}


Eis como eu reescreveria essa função, tirando-o de dentro da classe.

void remove_espacos(char *str){
if(str) // Só atua se str não for um ponteiro nulo.
while(*str){
if(isspace(*str))
*str='_';
++str; // Não tem problema mexer no valor de str, pois ele é uma mera cópia do ponteiro original, usado ao chamar a função.
}
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts