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 ;)
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.
Gracias Khronos14 no se me había ocurrido de esa forma :D
.
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;
}
¿Y por qué no usar ANSI C?
char *strrev(char *s);
Saludos.
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!¡.
¿Y el porqué de esta macro tan innecesaria?
Cita de: Queta en 18 Agosto 2011, 20:17 PM
¿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!¡.
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
strrevSaludos.
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 (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
Cita de: BlackZeroX▓▓▒▒░░ en 19 Agosto 2011, 00:13 AM
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?
.
Antes que nada no me oriente solo a cadenas de texto... di una obtativa de invertir un bloque de BYTE.
Cita de: escabe en 19 Agosto 2011, 01:24 AM
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!¡.