Manejo de strings enormes y caracteres?

Iniciado por @XSStringManolo, 10 Junio 2019, 22:59 PM

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

@XSStringManolo

Estoy haciendo un cifrado Cesar. El descifrado muestra las 255 posibles opciones del texto y lo guarda en el string.

En la funcion despues de crear el string en el que guardare el texto uso nombredelstring.reserve(1000000);
Para tener espacio en el string.

Despues de guardar todo en el string uso
nombredelstring.shrink_to_fit();
Para ajustar el tamaño del string a sus necesidades reales.

El problema lo tengo despues de la llamada a la funcion en main cuando intento tomar datos por entrada con cin. Se me salta varios cin y no deja al usuario del programa introducir los valores.

El programa es muy sencillo. Lo pondre resumido.
Código (cpp) [Seleccionar]
string Funcion(string texto)
{
string textosalida;
  for (int vueltas =1; vueltas <256; ++vueltas)
  {
   textosalida += "\nDespues de este mensaje ves la opcion ";
        for (auto iter = texto.begin(); iter != texto.end(); ++iter)
        {
         textosalida += (*iter + vueltas);
        }
   }
return textosalida;
}

int main()
{
string blabla;
cout <<"bla bla";
getline(cin, blabla);

string texto = Funcion(blabla);
cout << texto;

int guardar =4;
//Aqui el problema:
cout << endl << endl << "pulsa 1 para bla bla bla" <<endl;
cin >> guardar;
//Se salta el cin anterior y entra en el siguiente if sin razon logica aparente.

if (guardar ==1)
{
cout << "Guardando en documento, pon el titulo" <<endl;
//getline...
}

cin.get()
return 0;
}

Suponí que era un error del buffer. Asique probe con cin.ignore(); Pero debe ser algun fallo de memoria o algo que no sé como solucionar.

En el ejemplo de meterle abc como texto a la funcion guarda lo siguiente en el string:
Despues de este mensaje ves la opcion abc
Despues de este mensaje ves la opcion bcd
Despues de este mensaje ves la opcion cde
...
Despues de este mensaje ves la opcion abc

Da 256 vueltas para mostrar todas las opciones posibles del texto cifrado para que ek usuario las mire y descubra cual era el texto original.
Por lo que el string puede ser enorme ya que va a multiplicar por 256 cualquier texto que introduzca el usuario.

A qué se debe el fallo?
Debería usar vectores de strings? O se puede hacer con un string?

Si necesitais el código completo, lo paso, pero poco más que eso es.

Como la salida es muy grande queria ponerle opcion para escribir en un documento de texto la salida y abrir el documento desde el programa para poder ver todas las posibilidades.

K-YreX

No tengo ningún problema con ese código. Lo he probado primero con una versión muy simple (simplemente el <getline()> y el <cin>) y funciona bien así que después he probado tu código y dejando al margen unos caracteres extraños (decir que estoy en Linux) no he tenido ningún problema de que se salte el <cin>.
Prueba a cerrar el proyecto y volver a abrirlo, puede que sea un problema de eso. Sino no sé qué puede ser... :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

@XSStringManolo

Muchas gracias. Ya encontré el problema. Lo arregle con un cin.ignore();

apuromafo CLS

no veo problema, si podrias cambiar un pequeño orden y probar que tal va funcionando, defines la variable int guardar como 4, como un int, siendo que cuando colocan cin puede tomarlo como:
Citar
#include "iostream"
#include "string"

using namespace std;

de:
Código (cpp) [Seleccionar]
int guardar =4;
//Aqui el problema:
cout << endl << endl << "pulsa 1 para bla bla bla" <<endl;
cin >> guardar;



a

Código (cpp) [Seleccionar]
cout << endl << endl << "pulsa 1 para bla bla bla" << endl;
//ahi el programa imprimio información y la variable seteada temporal establecida //posiblemente fue anulada
int guardar; // defines que lo escrito es guardar
// guardar string
cout << "has escrito " << guardar<< ". Gracias por la nuestra aplicación" << endl;
cin >> guardar;
<< nombre <<



la idea de práctica seria

Código (cpp) [Seleccionar]
#include "iostream"
#include "string"

using namespace std;

int main()
{
    cout << "Hola! Este es un ejemplo en C++ foroelhacker dotnet" << "\n" << "Por favor ingrese su nombre:" << endl; //La instrucción \n es un salto de línea Mostrando los textos separados

   string nombre;//En esta variable estará almacenado el nombre ingresado.
   cin >> nombre; //Se lee el nombre

   cout << "Bienvenido al sistema " << nombre << ". Gracias por usar nuestra aplicación" << endl;


   return 0;
}



veo que lo has solucionado, pero igual yo creo que es sobre la variable que estableces o bien simplemente es problema de gui o entra al ciclo del if antes.

Saludos
Apuromafo


@XSStringManolo

El int guardar = 4 lo puse para probar el programa en el momento. Siempre pongo cosas random para probar el programa rápido antes de que se me escapen las ideas de la cabeza y no sepa que estaba haciendo por ponerme a implementar otra cosa.

Ya me va todo perfect! Muchas gracias.

Ahora ando con la api de windows a ver si consigo tomar el string del usuario mediante un EDIT control o un InputBox o algo que me sirva.

Estoy a buscar ejemplos pero no encuentro ni el primero.
Estoy ahora mismo probando con uno en C del año de la polka con buffers, chars, punteros, etc. Seguro que se puede hacer con strings de C++ pero no encuentro nada de momento y el ejemplo está incompleto asique o busco en otros libros, o me rompo la cabeza para entenderlo e intentar traducirlo a C++ si tengo suerte.
No puede ser tan complicado...

Quiero hacer una ventana rollo mini bloc de notas para escribir. Con un boton que sirva de enter y obtener el input del usuario en una variable string.

estuve haciendo menus y esas cosas con un .rc y un resource.h escribiéndolo a mano porque uso codeblocks. Igual se puede hacer desde ahí también. Ni idea.

Si sabeis como se hace genial!
Si no, no pasa nada. Si no lo encuentro yo seguiré viendo otras ventanas, etc hasta que controle lo suficiente como para que se me ocurra como hacerlo.

Igual puedo robarle al user el contenido del clipboard con un boton o algo así. Por falta de ideas no va a ser xD

apuromafo CLS

#5
existen mas componentes que un edit, yo apostaria por un memo o richtext (rtf) (tienen mayor capacidad de almacenaje de información.
ideas rapidas en un notepad:

un memo, con menu, con Status bar, busqueda de dialogo, abrir/cerrar archivos
yo tengo un source y exe de un notepad pero hecho en delphi (creado por Softdat CLS) pero como no es mio no puedo compartirlo aqui ,  espero a futuro el lo comparta a github, ahi podria indexarlo.

aqui en github hay un ejemplo de un notepad en c++
https://github.com/genuinelucifer/mypad


hay muchas cosas posibles, y dependerá de la información que manejes a mano.
Todo lo que esté bien modelado te saldrá bien, recuerda verificar siempre que al cerrar si quiere guardar los cambios y/o opciones.

Saludos

@XSStringManolo

Muchas gracias. Entre el link y los conesjos que me has dado, y los que me ha dado también uno de los moderadores, he sido capaz de encontrar un montón de ejemplos. Ahora los estoy probrando para ver cuales me sirven e implementarlos en uno de los esqueletos que tengo hechos.
Ahora a gestionar y asimilar toda la info con calma!