Foros del Web » Programación para mayores de 30 ;) » C/C++ »

como puedo invertir una cadena?

Estas en el tema de como puedo invertir una cadena? en el foro de C/C++ en Foros del Web. hola quiero saber como invertir el orden de una cadena sin usar srting se me ocurrió con 2 for pero no se como hacer para ...
  #1 (permalink)  
Antiguo 18/11/2012, 17:50
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
como puedo invertir una cadena?

hola quiero saber como invertir el orden de una cadena sin usar srting
se me ocurrió con 2 for pero no se como hacer para que el for recorra la cadena de izquierda a derecha y de derecha a izquierda al tiempo como lo tengo ahora recorrerá toda la cad_b con temp=cad_a[1]; pero si lo saco del for recorre toda la cadena i y luego toda la cadena j así no podría compararlos. aun estoy pensando que me falta pero no se me ocurre nada.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int main()
  5. {
  6. char* cad_a=new char[30];
  7. char* cad_b=new char[30];
  8. int i, j;
  9. char temp;
  10. cout << "Introduce una cadena: "; //pide los datos
  11. cin.getline (cad_a,30);
  12.  
  13. for(i=0; i<30; i++)
  14. cout << cad_a[i] << " "; //muestra es pantalla
  15. cout << endl << endl;
  16.  
  17. for(i=0; i<29; i++)
  18. {
  19.    
  20. for(int j=29; j>0; j--)
  21.    
  22. {
  23. temp=cad_a[i];
  24. cad_b[j]=temp;
  25. }
  26. for(j=0; j<30; j++)
  27. cout << cad_b[j] << " "; //muesta cadena invertida
  28.  
  29. return 0;
  30. }
  #2 (permalink)  
Antiguo 18/11/2012, 18:24
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 12 años
Puntos: 10
Respuesta: como puedo invertir una cadena?

Puedes usar un for que recorra de izquierda a derecha

cad_a[i]

y para recorrer la otra cadena de derecha a izquierda seria
cad_b[29-i] (29 ya que cad_b es de 0..29)
  #3 (permalink)  
Antiguo 18/11/2012, 19:02
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: como puedo invertir una cadena?

gracias pero ahora tengo otra duda me imprime como basura y no se como quitarla

y la segunda es con la ultima parte que añadí al codigo.
si escribo "amor a roma" cad_a es igual a cad_b pero me imprime no es palindromo no se por que pasa esto.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int main()
  5. {
  6. char* cad_a=new char[30];
  7. char* cad_b=new char[30];
  8. int i, j;
  9. char temp;
  10. cout << "Introduce una cadena: "; //pide los datos
  11. cin.getline (cad_a,30);
  12.  
  13. for(i=0; i<30; i++)
  14. cout << cad_a[i] << " "; //muestra es pantalla
  15. cout << endl << endl;
  16.  
  17. for(i=0; i<29; i++)
  18. {  
  19. temp=cad_a[i];
  20. cad_b[29-i]=temp;
  21. }
  22. for(j=0; j<30; j++)
  23. cout << cad_b[j] << " "; //muesta cadena invertida
  24. if(cad_a==cad_b)
  25. cout<<"es palindromo";
  26. else
  27. cout<<"no es palindromo";
  28. return 0;
  29. }
  #4 (permalink)  
Antiguo 18/11/2012, 20:11
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 12 años
Puntos: 10
Respuesta: como puedo invertir una cadena?

en el for i es hasta i < 30, ya que el valor máximo que toma i sería 29, y como lo tienes tú sería i 28
así que cambia esa parte xd
  #5 (permalink)  
Antiguo 18/11/2012, 21:07
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: como puedo invertir una cadena?

ya era una bobada lo de igualar las cadenas aunque no entiendo lo que me dijiste de cambiarlo a 30 si cambio el tamaño a 30 no me imprime la ultima letra, auqne aun me imprime unos símbolos que no se de donde salen.
Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int main()
  5. {
  6. char* cad_a=new char[30];
  7. char* cad_b=new char[30];
  8. int i, j;
  9. char temp;
  10. cout << "Introduce una cadena: "; //pide los datos
  11. cin.getline (cad_a,30);
  12.  
  13. for(i=0; i<30; i++)
  14. cout << cad_a[i] << " "; //muestra es pantalla
  15. cout << endl << endl;
  16.  
  17. for(i=0; i<29; i++)
  18. {  
  19. temp=cad_a[i];
  20. cad_b[29-i]=temp;
  21. }
  22. for(j=0; j<30; j++)
  23. cout << cad_b[j] << " "; //muesta cadena invertida
  24. if(cad_a[i]==cad_b[j])
  25. cout<<"es palindromo";
  26. else
  27. cout<<"no es palindromo";
  28. return 0;
  29. }
  #6 (permalink)  
Antiguo 21/11/2012, 02:12
 
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 24
Antigüedad: 14 años
Puntos: 0
Respuesta: como puedo invertir una cadena?

Hola sonrasiel hasta donde se para comprar cadenas de caracteres se usa la funcion strcmp(str1,str2) de la libreria cstring, ahora para hacer la comparacion sin esa libreria deberia de hacerlo letra por letra mendiante un ciclo repetitivo, encuanto a los caracteres raros que no sabes de donde sale esos son basura que hay en memoria, ten en cuenta que declarastes un puntero char de 30 espacios (creo que no es necesario usar punteros) y el introducir: amor a roma estas usando 11 especion mas el caracter de terminacion de cadena (\0), y a la hora de recorrela en el for para imprimirla estas recorriendo los 30 espacio donde los 18 espacios restantes tienen basura que hay en memoria, deberia de carcular la cantidad de espacio de la palabra introducida y recorer esa cantidad.
  #7 (permalink)  
Antiguo 21/11/2012, 11:25
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: como puedo invertir una cadena?

hola gracias por el dato solo que ahora quede peor ya que debo hacer una función que me de la longitud de la cadena, ahí es donde no veo salida ya que si la función recibe una cadena no puede ser de tipo entero pero si es de tipo char no puedo retornarle un entero que es el que necesito para saber la longitud de la cadena no se que hacer.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int longitud(char cadena[])
  5. {
  6. for(int i=0;cadena[i]!='/0';i++){    
  7.         return i;
  8.     }
  9. int main()
  10. {
  11. cout<<"digite la frase";//pide los datos
  12. cin.getline(cadena,30);
  13.  
  14. char* cad_a=new char[];
  15. char* cad_b=new char[];
  16. int i,j,aux=0;
  17. char temp;
  18. //cout << "Introduce una cadena: "; //pide los datos
  19. //cin.getline (cad_a,longitud);
  20.  
  21. cout << cad_a<< "\t"; //muestra es pantalla
  22. cout << endl << endl;
  23.  
  24. for(i=0; i<29; i++)
  25. {  
  26. temp=cad_a[i];
  27. cad_b[29-i]=temp;
  28. }
  29. cout << cad_b<< "\t"; //muesta cadena invertida
  30. if(cad_a==cad_b)
  31. cout<<"es palindromo";
  32. else
  33. cout<<"no es palindromo";
  34. return 0;
  35. }
  #8 (permalink)  
Antiguo 21/11/2012, 12:04
 
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 24
Antigüedad: 14 años
Puntos: 0
Respuesta: como puedo invertir una cadena?

hola, a tu funcion longitud le falta la llave que cierra la funcion, pusistes la linea 18 y 19 como comentario, no veo que este usando la funcion longitud en ningun lado, no me habi fijado en la linea 11 y 12, la variable vadena que estas usando en la linea 12 no esta declarada, sera que podrias arreglar un poco tu codigo de como quieres que quede y volver a ponerlo, lo que quiero es ayudarte a que resuelvas el problema mas no hacerte tu tarea, de esta ultima forma no aprenderias nada, hasta los momentos en parte vas bien, seria cuestion de arreglarle unos detalles al codigo, la forma de comprar las cadenas aun es erronea.
  #9 (permalink)  
Antiguo 21/11/2012, 12:22
 
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 24
Antigüedad: 14 años
Puntos: 0
Respuesta: como puedo invertir una cadena?

con respecto al ultimo codigo he encontrado otros errores que habia sabacdo por alto, al crear las variables dinamicas cad_a y cad_b lo estan haciando sin especificar el tamaño del arreglo lo cual esta mal, en la funcion longitud estas usando return i dentro del for lo cual hace que se termine la funcion al entrar el for por primera vez, y el caracter de terminacion de cadena lleva barra diganal invertida ( \ ) la tienes mas y va a crear un ciclo infinito, quitale las llave al for y pon punto y coma ( ; ) al final de este y has la declaracion de i fuera del for arregla el caracter de terminacion y tendras tu funcion funcionando.

y esta la vas a usar despues de
Código C++:
Ver original
  1. //cout << "Introduce una cadena: "; //pide los datos
  2. //cin.getline (cad_a,longitud);

para recorrer solo la cantidad de espacios intruducida en los for,
  #10 (permalink)  
Antiguo 21/11/2012, 13:55
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: como puedo invertir una cadena?

disculpa newid hice lo que me dijiste
Código C++:
Ver original
  1. int longitud(char cad_a[])
  2. {
  3. for(int i=0;cad_a[i]!='\0';i++);  
  4.         return i;
  5. }
pero me salta este error

In function 'int longitud(char*)':
7 16 [Error] name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
7 16 (if you use '-fpermissive' G++ will accept your code)
  #11 (permalink)  
Antiguo 21/11/2012, 14:42
 
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 24
Antigüedad: 14 años
Puntos: 0
Respuesta: como puedo invertir una cadena?

el problema esta en al retornar la variable i esta no existe porque la estas creando de manera local dentro del for, hazlo de esta manera

Código C++:
Ver original
  1. int longitud(char cad_a[])
  2.     {
  3.     int i;
  4.     for(i=0;cad_a[i]!='\0';i++);  
  5.             return i;
  6.     }

y tu funcion trabajara sin problemas
  #12 (permalink)  
Antiguo 21/11/2012, 17:06
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: como puedo invertir una cadena?

ah gracias no me había fijado, claro que aun sigo con mi mayor problema no se como ingresarle a la función un carácter y que me retorne el entero " i " que seria el tamaño de la cadena ingresada de la función contador para ingresarlo en char* cad_a=new char[x] siendo x el valor de longitud(i).
lo que quiero saber es si realmente se puede o carece de sentido ya que no le veo mucho sentido ingresar una variable tipo char a una función entera, es como sumar manzanas con peras.
  #13 (permalink)  
Antiguo 21/11/2012, 18:21
 
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 24
Antigüedad: 14 años
Puntos: 0
Respuesta: como puedo invertir una cadena?

los que tienes que hacer es declarar tu varliable


Código C++:
Ver original
  1. char* cad_a=new char[30]

luego pedir el dato de entrada y despues usas tu funcion para que te retorne el numero de caracteres validos el cual vas a usar en tus ciclos repetivivos para limitar los espacios a imprimir o validad.

Etiquetas: int, invertir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:24.