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

Problemas al comparar una cadena

Estas en el tema de Problemas al comparar una cadena en el foro de C/C++ en Foros del Web. Tengo que crear un algoritmo que diga si el texto es palindromo o no. He verificado bien y el programa elimina los signos de puntuación ...
  #1 (permalink)  
Antiguo 23/04/2011, 11:23
 
Fecha de Ingreso: octubre-2010
Mensajes: 25
Antigüedad: 13 años, 6 meses
Puntos: 2
Pregunta Problemas al comparar una cadena

Tengo que crear un algoritmo que diga si el texto es palindromo o no. He verificado bien y el programa elimina los signos de puntuación en un segundo vector y también lo invierte correctamente, pero al comparar las cadenas espacios y reversa el programa hace lo se le antoja; a veces ejecuta el if y otras veces el else incorrectamente.

¡Ayúdenme por favor! Gracias de antemano.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8.     string cadena; string espacios;
  9.     string reversa = "";
  10.     char signos[] = "+-*/ <>()[]{}¡!¿?#$%&_@·ºª.,;:";
  11.  
  12.  
  13.     cout << "BUCANDO PALINDROMOS" << endl << endl;
  14.     cout << "Escribe: "; getline(cin, cadena, '\n');
  15.     espacios = cadena;
  16.  
  17.  
  18.     for(short c = cadena.length(); c >= 0; c--){
  19.  
  20.         for(short j = 0; signos[j]; j++){ //Para eliminar los signos de arriba
  21.             if(cadena[c] == signos[j]){
  22.  
  23.                 espacios.erase(c, 1);
  24.  
  25.             }
  26.  
  27.         }
  28.  
  29.     }
  30.  
  31.     for(short c = espacios.length(); c >= 0; c--){
  32.  //Invirtiendo la cadena
  33.         reversa += espacios[c];
  34.     }
  35.  
  36.  
  37.         //AQUI EMPIEZA EL PROBLEMA
  38.     if(espacios == reversa){
  39.         cout << "Es un Palindromo" << endl;
  40.  
  41.     }
  42.  
  43.     else{
  44.  
  45.         cout << "No es palindromo" << endl;
  46.  
  47.     }
  48.  
  49.    
  50.  
  51.     return 0;
  52.  
  53. }
  #2 (permalink)  
Antiguo 23/04/2011, 13:14
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años
Puntos: 24
Respuesta: Problemas al comparar una cadena

Creo que lo que te falla es algo muy simple.
Fijate en estas lineas que tines
Código:
 for(short c = espacios.length(); c >= 0; c--){
El bucle lo realizas una un total de length +1. Tienes que empezar desde espacios.length()-1 ya que este sería el índice del último carácter.
Código:
 for(short c = espacios.length()-1; c >= 0; c--){
__________________
Foros Desarrollo de Juegos
  #3 (permalink)  
Antiguo 23/04/2011, 13:26
 
Fecha de Ingreso: octubre-2010
Mensajes: 25
Antigüedad: 13 años, 6 meses
Puntos: 2
Pregunta Respuesta: Problemas al comparar una cadena

Cita:
Iniciado por ssaammuu Ver Mensaje
Creo que lo que te falla es algo muy simple.
Fijate en estas lineas que tines
Código:
 for(short c = espacios.length(); c >= 0; c--){
El bucle lo realizas una un total de length +1. Tienes que empezar desde espacios.length()-1 ya que este sería el índice del último carácter.
Código:
 for(short c = espacios.length()-1; c >= 0; c--){
¿Lo que intentas decirme es que debo evitar el caracter nulo '\0' de la cadena que voy a invertir o qué? Explicame, por favor... creo que he metido la pata dos veces en lo mismo
  #4 (permalink)  
Antiguo 23/04/2011, 15:13
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años
Puntos: 24
Respuesta: Problemas al comparar una cadena

No, sino que estás intentando acceder a un carácter de la cadena que no existe. Por ejemplo:
Código:
string cadena="ae";
int longitud=cadena.length(); // = 2
Tu código intententa acceder a cadena[longitud] al principio del bucle, es decir cadena[2], y este no existe porque el último carácter va a tener índice (longitud-1).

Código:
getline(cin, cadena, '\n');
lo puedes cambiar por
Código:
getline(cin, cadena);
ya que getline() extrae una linea entera de todas formas.
__________________
Foros Desarrollo de Juegos

Etiquetas: c++, cadenas
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 02:47.