[C] [source] Revertir Cadenas

Iniciado por .::DoX::., 18 Agosto 2011, 01:55 AM

0 Miembros y 1 Visitante están viendo este tema.

.::DoX::.

Hola a todos...
Bueno estoy comenzando a aprender a manejar C y he estado haciendo algunos códigos, así que aquí les dejo un pequeño código que hice para revertir el orden de una cadena.

char * Revertir(char *Cadena, int tam)
{

int i;
char *tmp;

tmp = (char*)malloc(tam);

for (i = tam - 1; i >= 0; i--)
{
tmp[(tam-1)-i] = Cadena[i];
}

tmp[tam] = '\0';

return tmp;
}



Ejemplo de uso:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * Revertir(char *Cadena, int tam);

int main()
{

char *hi = "Hola a todos";
char *res;

res = Revertir(hi, strlen(hi));
printf(res);

getchar();

}


Saludos  ;)

Khronos14

Aquí te dejo mi versión, para que le eches un ojo ;)


#include <stdio.h>
#include <string.h>

void revertir(char * cadena)
{
unsigned int i = 0;
char temp = NULL;
unsigned int len = strlen(cadena);

for (; i < len / 2; i++)
{
temp = cadena[i];
cadena[i] = cadena[len - i - 1];
cadena[len - i - 1] = temp;
}
}

int main(int argc, char * argv[])
{
char cadena[] = "Esto es una cadena";

printf("%s\n", cadena);
revertir(cadena);
printf("%s\n", cadena);

getchar();
return 0;
}


Puedes observar, que modifico el mismo puntero que se pasa como parámetro. Además sólo recorro la mitad del array, haciendo que la función sea mucho más rápida.

Saludos.

.::DoX::.

Gracias Khronos14 no se me había ocurrido de esa forma  :D

BlackZeroX

#3
.
Te dejo mi version:



#define BYTE unsigned char

BYTE* reverse(BYTE* pbyData, size_t szSize) {
    size_t i = 0x0;
    if (szSize > 1)
        for (;i < --szSize; i++) {
            pbyData[i]      ^= pbyData[szSize];
            pbyData[szSize] ^= pbyData[i];
            pbyData[i]      ^= pbyData[szSize];
        }
    return pbyData;
}

int main()
{
    char  szCadena[]  = "Hola Mundo";
    printf("%s\n", reverse((BYTE*)szCadena, strlen(szCadena)));
    getchar();
    return 0;
}

The Dark Shadow is my passion.

escabe

¿Y por qué no usar ANSI C?

char *strrev(char *s);

Saludos.

BlackZeroX

Cita de: escabe en 18 Agosto 2011, 10:23 AM
¿Y por qué no usar ANSI C?

char *strrev(char *s);

Saludos.

Se esta usando ANSI C, quizas querias decir "la libreria de C"

strrev solo funciona con strings, encambio mi funcion funciona con una longitud dada.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Queta

#6
¿Y el porqué de esta macro tan innecesaria?
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

BlackZeroX

#7
Cita de: Queta en 18 Agosto 2011, 20:17 PM
¿Y el porqué de esta macro tan innecesaria?

leete esto: macros

Hasta donde he visto la bibioteca string.h no tiene definida strrev como macro

* Trato de cadenas, codificacion, Busqueda de patrones, palabras capicua, palindromos... y un largo etc, no se debe usar de manera explicita este algorimo, puede ser acoplado de igual manera a X indole.

Dulces Lunas!¡.
The Dark Shadow is my passion.

escabe

Cita de: BlackZeroX▓▓▒▒░░ en 18 Agosto 2011, 20:02 PM
Se esta usando ANSI C, quizas querias decir "la libreria de C"
Si, tienes razón...

Cita de: BlackZeroX▓▓▒▒░░ en 18 Agosto 2011, 20:02 PM
strrev solo funciona con strings, encambio mi funcion funciona con una longitud dada.
Sin desmerecer tu código BlackZeroX▓▓▒▒░░, el título del hilo... ¿No se refería a cadenas? Y el código inicial ¿No iba enfocado a cadenas de texto?

Para este caso yo uso strrev

Saludos.

rir3760

Cita de: r0rx en 18 Agosto 2011, 01:55 AM
Bueno estoy comenzando a aprender a manejar C y he estado haciendo algunos códigos, así que aquí les dejo un pequeño código que hice para revertir el orden de una cadena.

char * Revertir(char *Cadena, int tam)
{

int i;
char *tmp;

tmp = (char*)malloc(tam);

for (i = tam - 1; i >= 0; i--)
{
tmp[(tam-1)-i] = Cadena[i];
}

tmp[tam] = '\0';

return tmp;
}

En la función tienes un error al reservar memoria para "tam" caracteres ya que falta espacio para un carácter (para el '\0'), aparte de eso no es necesaria la conversión explicita.

Con la corrección mas algunos cambios (todos ellos menores):
char *invertir(char const *cad, int num_chars)
{
   char *tmp;
   int i;
   
   tmp = malloc(num_chars + 1);
   
   for (i = 0; i < num_chars; i++)
      tmp[i] = cad[num_chars - 1 - i];
   tmp[i] = '\0';
   
   return tmp;
}



----


Cita de: escabe en 18 Agosto 2011, 10:23 AM
¿Y por qué no usar ANSI C?

char *strrev(char *s);
Esa función no es parte de la biblioteca estándar de C.


----


Cita de: BlackZeroX?????? en 19 Agosto 2011, 00:13 AM
Cita de: Queta en 18 Agosto 2011, 20:17 PM
¿Y el porqué de esta macro tan innecesaria?

leete esto: macros

Seria mejor evita esa macro y en su lugar utilizar el tipo "char". Ello porque en C una cadena literal como "hola, mundo" es de tipo "array N of char". Aqui el problema es: si el tipo "char" es equivalente a "signed char" o "unsigned char" depende de la implementancion.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language