• Domingo 8 de Septiembre de 2024, 04:23

Autor Tema:  invertir cadena en el mismo array  (Leído 3777 veces)

jusit

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
invertir cadena en el mismo array
« en: Miércoles 17 de Febrero de 2010, 12:08 »
0
Hola,
Tengo que hacer un ejercicio en el que hay que invertir una cadena de caracteres en un mismo vector con punteros. Lo he probado varias veces pero no consigo dar con la solución, ya que o bien me copia una letra, repitiéndola en todos los elementos del vector, o solo llega hasta la mitad y luego duplica el resto de letras.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define N 100
  6.  
  7. main()
  8. {
  9. char cadena[N];
  10. int i,lon=0;
  11. char *cad=NULL;
  12.  
  13. cad=cadena;
  14.  
  15. gets(cadena);
  16. fflush(stdin);
  17. lon=strlen(cadena);
  18.  
  19. for (i=0,lon=-1;i<=lon;i++)
  20. {
  21.   *(cad+i)=*(cad+lon-1);
  22. }
  23.  
  24. puts(cad);
  25.  
  26. system("pause");
  27. }
  28.  
  29.  

La verdad es que hace poco que empecé con el tema de los punteros, y aún tengo muchas dudas. Cuál podría ser el problema del código?

droezva

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: invertir cadena en el mismo array
« Respuesta #1 en: Viernes 26 de Febrero de 2010, 03:34 »
0
Bueno te dejo una explicación y el desarrollo de la solucion espero que te sirva :)

Código: C
  1.  
  2. /*
  3. Lo que te hiso falta fue utilizar el metodo para intercambiar valores entre dos variables
  4. sin perder ninguno de los dos, lo que hace es  almacenar el valor de una de las variables en una variable temporal.
  5. Normalmente esto se ve en temas de Ordenamiento de Vectores y cosas asi.
  6. Ejemplo:
  7. temp = v[0];
  8. v[0] = v[4];
  9. v[4] = temp;
  10.  
  11. Bueno si lo que se quiere es invertir la cadena que la vamos a tratar como un vector, analisando
  12. que el problema vemos que el primer elemento corresponde con el ultimo algo asi:
  13. cadena = "abcde";
  14.  |-----------|
  15.  |   |----|  |
  16. [a][b][c][d][e]
  17.  
  18. Intercambiando quedaria asi
  19.  
  20.  |-----------|
  21.  |   |----|  |
  22. [e][d][c][b][a]
  23.  
  24. Podemos ver que nada mas tenemos que hacer dos veces el procesos de intercambiar los valores.
  25. el a con e y el de b con d, puesto que c esta en el centro no hay que hacerlo.
  26.  
  27. Observando esto determinamos que para invertir la cadena tenemos que hacer (n / 2) veces
  28. el intercambio, donde n es la longitud de la cadena.
  29.  
  30. */
  31. #include <stdio.h>
  32. #include <string.h>
  33. #define N 100
  34.  
  35. void main()
  36. {
  37.     char cadena[N];
  38.     int i, mitad, lon=0;
  39.     char *cad = NULL, temp;
  40.  
  41.     cad = cadena;
  42.  
  43.     gets(cadena);
  44.     fflush(stdin);
  45.     lon = strlen(cadena);
  46.     mitad = lon / 2;
  47.     for( i=0; i < mitad; i++)
  48.     {
  49.       temp = *(cad+i);
  50.       *(cad+i) = *(cad+lon-1-i);
  51.       *(cad+lon-1-i) = temp;
  52.     }
  53.     puts(cad);
  54. }
  55.  
  56.  
  57.  

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: invertir cadena en el mismo array
« Respuesta #2 en: Sábado 27 de Febrero de 2010, 14:43 »
0
esta buena la explicacion anterior pero yo lo haria con una funcion
seria asi:
Código: C
  1. char * invertir_cadena(char *cad)
  2. {char *aux=*cad,inter,*inicio=*cad;
  3.  while(*aux)
  4.    aux++;
  5.  aux--;
  6.  while(aux>cad)
  7.    {inter=*cad;
  8.     *cad=*aux;
  9.     *aux=inter;
  10.     aux--;
  11.     cad++;
  12.    }
  13.  return inicio;
  14. }
  15.  
  16.  
lo que yo utizo es aritmetica de punteros para manejarme insitu sobre la cadena y la funcion devuelve un char* para que a puedas poner xej en un puts o fprintf