[Resuelto]¿Cómo puedo solucionar este error en el uso de vectores con strings?

Iniciado por OmarHack, 19 Junio 2013, 04:42 AM

0 Miembros y 1 Visitante están viendo este tema.

OmarHack

En el siguiente código resulta que al poner textos[3] dentro de un if el programa me obliga a llenar el vector. Pero claro está que no siempre se va a llenar.

Si no lo lleno, es decir, si pongo menos de cuatro palabras separadas por espacios en la ejecución del programa me da el error: "Violación de acceso a memoria restringida (segmentacion fault) error en el programa" La pregunta es, ¿Cómo lleno el vector sin saber el número de palabras que va a poner el usuario?

Por si sirve de algo el programa va a estar en un while infinito ejecutándose una y otra vez, tengo que crear y destruir el vector cada vez que empieza el bucle de 0 o así está bien?

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;


int main()
{
    string texto;
    cout << "Que quiere traducir?: ";
    getline(cin, texto);

    istringstream is(texto);
    vector <string> textos;
   

    while( is >> texto )
         textos.push_back( texto );
    cout <<"Las palabras que pusiste son: " <<endl;
    for (unsigned int i = 0; i < textos.size(); i++)
         {
         cout << i + 1 << ". " << textos[i] << endl;
         }
       
         if (textos[0] == "coche" )
{
cout << endl << "En ingles coche es car" << endl;
}
         if (textos[0] == "hola" )
{
cout << "En ingles hola es hello" << endl;
}

         if (textos[1] == "hola" )
{
cout << "En ingles hola es hello" << endl;
}

         if (textos[2] == "hola" )
{
cout << "En ingles hola es hello" << endl;
}


         if (textos[3] == "hola" )
{
cout << "En ingles hola es hello" << endl;
}

    system("pause");
    return 0;
}


A ver si me podéis echar una manita! :)
Saludos.
I like to test things.

ecfisa

Hola Omar.

El problema lógico que veo en ese código es que el resultado va a depender del órden de ingreso, es decir que si ingresa "coche" en tercer lugar, nunca lo va a traducir.

Otro problema, mas grave, es que si por ejemplo ingresas dos palabras, los errores aparecerían luego del segundo if. Ya que a partir de ahí, estarías intentando acceder a posiciónes inexistentes del vector. (de allí la violación de acceso)

Una forma un poco distinta de implementarlo podría ser:
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

struct {
 char *spa;
 char *eng;
} traduc[] = {"coche","car","hola","hello","perro","dog",
             "casa","house","ciudad","city","cielo",
             "sky","vaca","cow","ojos","eyes"};

int main()
{
 string str;
 vector <string> texto;
 unsigned i,j;

 cout << "Que quiere traducir?: ";
 getline(cin, str);
 stringstream is(str);
 while(is >> str) texto.push_back(str);

 cout <<"Las palabras que pusiste son: " << endl;
 for (i = 0; i < texto.size(); i++)
   cout << i + 1 << ". " << texto[i] << endl;
 cout << endl;

 for(i = 0; i < texto.size(); i++)
   for(j = 0; j < sizeof(traduc)/sizeof(traduc[0]); j++)
     if(strcmp(texto[i].c_str(), traduc[j].spa) == 0)
       cout << traduc[j].spa << " en ingles es " << traduc[j].eng << endl;

 cin.get();
 return 0;
}


Saludos  :)

amchacon

Otra propuesta de código:

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <map>

using namespace std;

int main()
{
   unsigned int i;
   string str;
   vector <string> texto;
   map<string,string> Diccionario;

   Diccionario["coche"] = "car";
   Diccionario["hola"] = "hello";
   Diccionario["perro"] = "dog";
   Diccionario["casa"] = "house";
   Diccionario["ciudad"] = "city";
   Diccionario["cielo"] = "sky";
   Diccionario["vaca"] = "cow";
   Diccionario["ojos"] = "eyes";

   cout << "Que quiere traducir?: ";

   getline(cin, str);
   stringstream is(str);

   while(is >> str) texto.push_back(str);

   cout <<"Las palabras que pusiste son: " << endl;

   for (i = 0; i < texto.size(); i++)
       cout << i + 1 << ". " << texto[i] << endl;

   cout << endl;

   for(i = 0; i < texto.size(); i++)
               cout << texto[i] << " en ingles es " << Diccionario[texto[i]] << endl;

   cin.get();
   return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

Tiene buena pinta amchacon, al cojer el ordenador lo pruebo. Una duda sobre tu código, si pongo en la ejecución: hola coche casa coche hola ojos
Me devolverán todos los couts que les ponga a cada uno?
Y después necesito comparar con ifs ejemplo: if (diccionario[coche] == "coche") mifuncion();
Tú siempre solucionándome los problemas!! :)
I like to test things.

amchacon

Cita de: OmarHack en 19 Junio 2013, 13:22 PMTú siempre solucionándome los problemas!! :)
Eh, que el código de eficsa también vale :)

Cita de: OmarHack en 19 Junio 2013, 13:22 PMTiene buena pinta amchacon, al cojer el ordenador lo pruebo. Una duda sobre tu código, si pongo en la ejecución: hola coche casa coche hola ojos
Me devolverán todos los couts que les ponga a cada uno?
Claro

Cita de: OmarHack en 19 Junio 2013, 13:22 PMY después necesito comparar con ifs ejemplo: if (diccionario[coche] == "coche") mifuncion();
Tú siempre solucionándome los problemas!! :)
No no, ese era otro ejemplo en el que había punteros a funcion.

El código que te he puesto funciona tal cual.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

El de ecfisa no me sirve, por supuesto gracias por ayudarme.
Yo no quiero un diccionario, quiero saber usar eses tipos de datos en casos como puede ser un diccionario. En este caso con que me de respuestas, independientemente de si es un cout o una funcion me sirve.
Por casualidad no sabreis solucionar los fallos de mi código no? Es que ni idea de por que pasa :S
Saludos.
I like to test things.

amchacon

Cita de: OmarHack en 19 Junio 2013, 14:16 PMPor casualidad no sabreis solucionar los fallos de mi código no?
No compruebas el tamaño del vector, si te introduzco 2 palabras y me compruebas 3 pues...

Ya te he puesto 2 ejemplo usando maps, a aprendértelo  ;-)
http://minidosis.org/C++/Maps/
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

Cita de: amchacon en 19 Junio 2013, 14:19 PM
No compruebas el tamaño del vector, si te introduzco 2 palabras y me compruebas 3 pues...

Ya te he puesto 2 ejemplo usando maps, a aprendértelo  ;-)
http://minidosis.org/C++/Maps/
¿Y es muy lioso arreglarlo? Es decir, yo con un máximo de 10 palabras simultaneas me conformo, y después que el programa no tenga problema tanto si pongo 1 palabra como 2, como 3, o como 10. Mira que le di mil vueltas, ahora me pongo con tu código a estudiarlo a adaptarlo y a implementar la clase maps cuando lo tenga listo. :)
I like to test things.

amchacon

Esque tú código no hay por donde cogerlo.

Supongo que querías hacer esto:

Código (cpp) [Seleccionar]
for (int i = 0; i < Texto.size();i++)
{
  if (Texto[i] == "hola")
  {
     cout<<"hello";
  }
  if (Texto[i] == "coche")
  {
     cout<<"car";
  }
  if (Texto[i] == "eyes")
  {
     cout<<"Ojos";
  }
}


Funcionaría, pero es una forma muy fea y no muy eficiente.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

El tuyo va perfecto! Lo acabo de probar y hace justo lo que quiero, pero no sé como usarlo en los ifs, quiero que si pongo hola no solo me ponga hello de respuesta, si no que ejecute una serie de acciones, como podrías ser llamar a otro ejecutable, imprimir un texto, o llamar a una función. Voy a intentar explicártelo a ver si entiendes, quiero algo así como lo siguiente, pero si escribo en el programa en ejecución por ejemplo: 2 hola 1 2 3 1 2 1 hola 1 se ejecuten por orden todas esas que e llamado. Con el código que me pusiste no se puede hacer no? Es para lo que hice yo el mio, pero me da el error ese de que si pongo menos de 10 argumentos en ejecución me da error.
Si lo pongo tal cual en un string, no puedo poner más de un parámetro por vez en la ejecución. Y eso es lo que me interesa, que pueda poner una frase con lo que sea por ejemplo: "hola 1 que tal" o "tal que hola 1" y haga cada cosa que tenga declarada como en el código siguiente. Entonces al poner "hola 1 que tal" el programa lo interpretaría como:

hola >> llama a una funcion, imprime un texto y cambia el valor a 2 variables
1 >> llama a una funcion y imprime un texto
que >> muestra el texto "no existe"
tal >> muestra el texto "no existe"


Y si en cambio pongo "que tal 2 hola" el programa lo interprete así:

que >> muestra el texto "no existe"
tal >> muestra el texto "no existe"
2 >> muestra el valor de 3 variables
hola >> llama a una funcion, imprime un texto y cambia el valor a 2 variables

En principio mi código hace eso, pero tiene el fallo que comente, con el tuyo no sé como hacerlo.  :(


if (texto == "1")
{
llama a la funcion;
imprime un texto;
}

if (texto == "2")
{
muestra el valor de 3 variables;
}

if (texto == "1")
{
cambia el valor a 2 variables;
}

if (texto == "3")
{
salir del programa o reiniciar
}

if (texto == "hola")
{
llama a una funcion;
imprime un texto;
cambia el valor a 2 variables;
}

if (texto == "casa")
{
..........
}

if (texto == "ordenador")
{
}

else cout <<"no existe";


I like to test things.