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.
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.
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.
}
}