elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] [source] Revertir Cadenas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [C] [source] Revertir Cadenas  (Leído 7,906 veces)
.::DoX::.

Desconectado Desconectado

Mensajes: 4



Ver Perfil
[C] [source] Revertir Cadenas
« 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  ;)


En línea

Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: [C] [source] Revertir Cadenas
« Respuesta #1 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.


En línea

.::DoX::.

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: [C] [source] Revertir Cadenas
« Respuesta #2 en: 18 Agosto 2011, 03:16 am »

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

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [C] [source] Revertir Cadenas
« Respuesta #3 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.  
« Última modificación: 20 Agosto 2011, 07:45 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: [C] [source] Revertir Cadenas
« Respuesta #4 en: 18 Agosto 2011, 10:23 am »

¿Y por qué no usar ANSI C?

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

Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [C] [source] Revertir Cadenas
« Respuesta #5 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!¡.
En línea

The Dark Shadow is my passion.
Queta

Desconectado Desconectado

Mensajes: 267



Ver Perfil
Re: [C] [source] Revertir Cadenas
« Respuesta #6 en: 18 Agosto 2011, 20:17 pm »

¿Y el porqué de esta macro tan innecesaria?
« Última modificación: 18 Agosto 2011, 20:20 pm por Queta » En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [C] [source] Revertir Cadenas
« Respuesta #7 en: 19 Agosto 2011, 00:13 am »

¿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!¡.
« Última modificación: 19 Agosto 2011, 00:18 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: [C] [source] Revertir Cadenas
« Respuesta #8 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.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] [source] Revertir Cadenas
« Respuesta #9 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

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
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
cifrar y Descencriptar cadenas (source)
Programación Visual Basic
vivachapas 3 3,467 Último mensaje 2 Noviembre 2008, 00:33 am
por vivachapas
[SOURCE] Codificador de cadenas :P (act)
Programación Visual Basic
79137913 0 1,290 Último mensaje 7 Febrero 2011, 19:04 pm
por 79137913
Revertir ReFOX XI
Ingeniería Inversa
k!k3 1 2,749 Último mensaje 3 Junio 2017, 00:34 am
por MCKSys Argentina
[Ayuda]Hay manera de revertir takeown e icacls?
Windows
Aquastripe 2 1,676 Último mensaje 22 Octubre 2018, 02:11 am
por EdePC
Revertir Juegos de Casino
Ingeniería Inversa
Geovane 3 1,225 Último mensaje 4 Diciembre 2018, 00:21 am
por rub'n
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines