Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: .::DoX::. en 18 Agosto 2011, 01:55 am



Título: [C] [source] Revertir Cadenas
Publicado por: .::DoX::. en 18 Agosto 2011, 01:55 am
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.

Código
  1. char * Revertir(char *Cadena, int tam)
  2. {
  3.  
  4. int i;
  5. char *tmp;
  6.  
  7. tmp = (char*)malloc(tam);
  8.  
  9. for (i = tam - 1; i >= 0; i--)
  10. {
  11. tmp[(tam-1)-i] = Cadena[i];
  12. }
  13.  
  14. tmp[tam] = '\0';
  15.  
  16. return tmp;
  17. }


Ejemplo de uso:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char * Revertir(char *Cadena, int tam);
  6.  
  7. int main()
  8. {
  9.  
  10. char *hi = "Hola a todos";
  11. char *res;
  12.  
  13. res = Revertir(hi, strlen(hi));
  14. printf(res);
  15.  
  16.  
  17. }

Saludos  ;)


Título: Re: [C] [source] Revertir Cadenas
Publicado por: Khronos14 en 18 Agosto 2011, 02:44 am
Aquí te dejo mi versión, para que le eches un ojo ;)

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void revertir(char * cadena)
  5. {
  6. unsigned int i = 0;
  7. char temp = NULL;
  8. unsigned int len = strlen(cadena);
  9.  
  10. for (; i < len / 2; i++)
  11. {
  12. temp = cadena[i];
  13. cadena[i] = cadena[len - i - 1];
  14. cadena[len - i - 1] = temp;
  15. }
  16. }
  17.  
  18. int main(int argc, char * argv[])
  19. {
  20. char cadena[] = "Esto es una cadena";
  21.  
  22. printf("%s\n", cadena);
  23. revertir(cadena);
  24. printf("%s\n", cadena);
  25.  
  26. return 0;
  27. }
  28.  

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.


Título: Re: [C] [source] Revertir Cadenas
Publicado por: .::DoX::. en 18 Agosto 2011, 03:16 am
Gracias Khronos14 no se me había ocurrido de esa forma  :D


Título: Re: [C] [source] Revertir Cadenas
Publicado por: BlackZeroX en 18 Agosto 2011, 08:09 am
.
Te dejo mi version:

Código
  1.  
  2. #define BYTE unsigned char
  3.  
  4. BYTE* reverse(BYTE* pbyData, size_t szSize) {
  5.    size_t i = 0x0;
  6.    if (szSize > 1)
  7.        for (;i < --szSize; i++) {
  8.            pbyData[i]      ^= pbyData[szSize];
  9.            pbyData[szSize] ^= pbyData[i];
  10.            pbyData[i]      ^= pbyData[szSize];
  11.        }
  12.    return pbyData;
  13. }
  14.  
  15. int main()
  16. {
  17.    char  szCadena[]  = "Hola Mundo";
  18.    printf("%s\n", reverse((BYTE*)szCadena, strlen(szCadena)));
  19.    getchar();
  20.    return 0;
  21. }
  22.  
  23.  


Título: Re: [C] [source] Revertir Cadenas
Publicado por: escabe en 18 Agosto 2011, 10:23 am
¿Y por qué no usar ANSI C?

Código:
char *strrev(char *s);

Saludos.


Título: Re: [C] [source] Revertir Cadenas
Publicado por: BlackZeroX en 18 Agosto 2011, 20:02 pm
¿Y por qué no usar ANSI C?

Código:
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!¡.


Título: Re: [C] [source] Revertir Cadenas
Publicado por: Queta en 18 Agosto 2011, 20:17 pm
¿Y el porqué de esta macro tan innecesaria?


Título: Re: [C] [source] Revertir Cadenas
Publicado por: BlackZeroX en 19 Agosto 2011, 00:13 am
¿Y el porqué de esta macro tan innecesaria?

leete esto: macros (http://laurel.datsi.fi.upm.es/~rpons/personal/trabajos/curso_c/node90.html)

Hasta donde he visto la bibioteca string.h no tiene definida strrev como macro (http://laurel.datsi.fi.upm.es/~rpons/personal/trabajos/curso_c/node90.html)

 * 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!¡.


Título: Re: [C] [source] Revertir Cadenas
Publicado por: escabe en 19 Agosto 2011, 01:24 am
Se esta usando ANSI C, quizas querias decir "la libreria de C"
Si, tienes razón...

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.


Título: Re: [C] [source] Revertir Cadenas
Publicado por: rir3760 en 19 Agosto 2011, 03:48 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.

Código
  1. char * Revertir(char *Cadena, int tam)
  2. {
  3.  
  4. int i;
  5. char *tmp;
  6.  
  7. tmp = (char*)malloc(tam);
  8.  
  9. for (i = tam - 1; i >= 0; i--)
  10. {
  11. tmp[(tam-1)-i] = Cadena[i];
  12. }
  13.  
  14. tmp[tam] = '\0';
  15.  
  16. return tmp;
  17. }

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):
Código
  1. char *invertir(char const *cad, int num_chars)
  2. {
  3.   char *tmp;
  4.   int i;
  5.  
  6.   tmp = malloc(num_chars + 1);
  7.  
  8.   for (i = 0; i < num_chars; i++)
  9.      tmp[i] = cad[num_chars - 1 - i];
  10.   tmp[i] = '\0';
  11.  
  12.   return tmp;
  13. }


----


¿Y por qué no usar ANSI C?

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


----


¿Y el porqué de esta macro tan innecesaria?

leete esto: macros (http://laurel.datsi.fi.upm.es/~rpons/personal/trabajos/curso_c/node90.html)

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


Título: Re: [C] [source] Revertir Cadenas
Publicado por: Queta en 19 Agosto 2011, 13:55 pm
leete esto: macros (http://laurel.datsi.fi.upm.es/~rpons/personal/trabajos/curso_c/node90.html)

Hasta donde he visto la bibioteca string.h no tiene definida strrev como macro (http://laurel.datsi.fi.upm.es/~rpons/personal/trabajos/curso_c/node90.html)

 * 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!¡.

Repito, estás utilizando una macro innecesaria. ¿Acaso BYTE no es una macro?


Título: Re: [C] [source] Revertir Cadenas
Publicado por: BlackZeroX en 20 Agosto 2011, 03:45 am
.
Antes que nada no me oriente solo a cadenas de texto... di una obtativa de invertir un bloque de BYTE.

Si, tienes razón...
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.


Dos palabras: Texto Unicode!¡.
Por que no hacer una funcion mas dinamica?, acaso quieres estar reescribiendo una funcion para cada caso que se te presente?
Esta buena strrev() para cadenas ANSI con terminacion de una cadena en Nulo, pero fuera de eso si es igual una cadena ANSI pero que tiene un caracter nulo que se debe tomar en cuenta?...

@Queta

Codigo Prolijo-Dinamico!¡.

La funcion tiene un sentido de ser Dinamica y no encerrarse en una sola cuestion, si es multiusos que mejor no lo crees?, pero fuera de esto no te he respondido adecuadamente.

Use la macro BYTE debido a que la funcion designa de manera mas descriptiva que trabajara con un bloque de Bytes segun el puntero, en esta cuestion NO veo que afecte el transcurso normal de un algoritmo que tan solo invierte un bloque de X de Bytes sea cual sea, En otras palabras: NO ME QUISE ENCERRAR EN CADENAS ANSI, ademas la macro jamas se compila ¬¬".

Dulces Lunas!¡.