Ir para o conteúdo
PsySc0rpi0n

Função para inverter string

Mensagens Recomendadas

PsySc0rpi0n

Boas.

Estou a tentar fazer uma função para inverter a ordem dos caractéres de uma string... Mas ainda não está a funcionar bem! Algo está a correr mal.

char* up_sort (char* string){
 char* tmp_string = NULL;
 char tmp_char_lower, tmp_char;
 short unsigned int i = 0, j = 0;
 size_t len = 0;
 len = strlen (string);
 tmp_string = mem_alloc (BUFFER);
 tmp_char_lower = string [i];
 for (; j < len; j++){
   while (string [i] != '\0'){           //faz enquato não chego ao fim da string
     if (string [i] < tmp_char_lower) {  //compara o char actual com o char em tmp_char_lower
       tmp_char_lower = string [i];      //se for mais pequeno, guarda em tmp_char_lower
     }
     i++;                                //avança para o próximo char na string
   }
   tmp_char = string [j];                //guarda em tmp_char, o char mais à esquerda antes de guardar lá o char mais pequeno
   string [j] = tmp_char_lower;          //guarda o menor char na posição mais à esquerda na string, posição 'j'
   string [i - 1] = tmp_char;            //coloca o char guardado em tmp_char na posição onde estava antes o char mais pequeno
 //j++;                                  //recomeça a pesquisa pelo char mais pequeno a partir da posição anterior + 1 já que a posição anterior já tem o char mais pequeno encontrado em toda a string
 }
 string [len + 1] = '\0';
 free (string);
 return tmp_string;
}


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

PsySc0rpi0n,

O que está a correr mal? (deverias deixar isso claro, não esperes que vamos compilar o exemplo de imediato e testar para perceber qual é o erro).

De qualquer modo, parece-me muito código para um problema tão simples. Por que motivo queres ser tu a tratar da alocação de memória, etc? Seria mais simples se simplesmente assumisses que o programador trata disso tudo.

Experimenta resolver assim inicialmente:

void reverse(char *orig, char *dest, int size) {
 /* ... */
}

Depois podes adaptar o código para simplesmente substituir sem alocação de memória adicional (não me parece que seja necessário alocarmos memória para uma string temporária pelo meio)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

PsySc0rpi0n,

O que está a correr mal? (deverias deixar isso claro, não esperes que vamos compilar o exemplo de imediato e testar para perceber qual é o erro).

...

Neste momento o resultado é apenas lixo e é isso que ainda não percebi porque é que está a acontecer!

Editado por pwseo

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Reparei agora que a tua função se chama up_sort. Estás a tentar inverter a string ou não?

Não, fui eu que me enganei... A função de inverter a string já está feita e a funcionar! É mesmo para ordenar os caractéres por ordem crescente, neste caso!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

não percebi, isso á alguma tentativa de implementar um insertion sort ?

O objectivo é ordenar os caractéres por ordem crescente...

Por exmplo:

"haver" ficava "aehrv"...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bom, tentei um código copiado da net, supostamente um "insertion sort" e o resultado foi o mesmo que a minha função...

Deixo aqui as duas funções para me ajudarem a resolver o problema:

A minha função

/*****Sort Up*****/
char* up_sort (char* string){
 char tmp_char_lower, tmp_char;
 short unsigned int i = 0, j;
 size_t len = 0;

 len = strlen (string);

 tmp_char_lower = string [i];
 for (j = 0; j < len; j++){              //o j++ reduz o a pesquisa da esquerda para a direita já que os caractéres mais pequenos vão sendo sucessivamente gravados nas posições mais à esquerda na string
   i = j;
   while (string [i] != '\0'){           //faz enquato não chego ao fim da string
     if (string [i] < tmp_char_lower) {  //compara o char actual com o char em tmp_char_lower
       tmp_char_lower = string [i];      //se for mais pequeno, guarda em tmp_char_lower
     }
     i++;                                //avança para o próximo char na string
   }
   tmp_char = string [j];                //guarda em tmp_char, o char mais à esquerda antes de guardar lá o char mais pequeno
   string [j] = tmp_char_lower;          //guarda o menor char na posição mais à esquerda na string, posição 'j'
   string [i - 1] = tmp_char;            //coloca o char guardado em tmp_char na posição onde estava antes o char mais pequeno
 }
 string [len + 1] = '\0';
 return string;
}

A função que usei da net:

char* insertion_up_sort (char* string){
 short unsigned int y = 0, index_min = 0, x;
 size_t len = 0;
 char tmp_char;

 len = strlen (string);
 for (x = 0; x < len; x++){
   index_min = x;
   for (y = x; y < len; y++){
     if (string [index_min] > string [y])
       index_min = y;
   }
   tmp_char = string [x];
   string [x] = string [index_min];
   string [index_min] = tmp_char;
   printf ("String: %s\n", string);
 }
 return string;
}


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

testei a segunda função e deu o resultado correcto, qual a string que estás a testar ?

Com qualquer uma a mim as duas funções dão-me:

jose

eeeo

Pedro

PPPe

Acho que é este o resultado que me está a dar!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Pois, não sei o que se passou mas agora também já está a funcionar bem aqui!

Thanks


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.