Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 23 Agosto 2013, 02:10 AM

Título: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 02:10 AM
Hola de nuevo, mi nuevo problema es con la funcion que nombre en el titulo, y bueno el codigo es este:


#include<iostream>

using namespace std;

int main()
{
    char str1[5], str2[5];
    cout << "Introduce una frase: ";
    cin.getline(str1, 5, '\n');
    cout << "Tu frase es: " << str1;
    cout << endl << "Ingrese otra frase: ";
    cin.getline(str2, 5, '\n');
    cout << endl << "Tu frase es: " << str2 << endl;
    cin.get();
}



Como podran ver, el programa funcionara mal si el usuario introduce una cadena mayor a 4, y queria saber si me podrian ayudar con una solucion a eso.

Gracias
Título: Re: Problema con cin.getline
Publicado por: flony en 23 Agosto 2013, 05:56 AM
cambia el 5
 cin.getline(str1, 5,'\n');
por el numero que creas conveniente idem
in.getline(str2, 5, '\n');
lo mismo en el vector char str1[5], str2[5];
=====
una opcion es usar string que son por decirlo asi vectores dinamicos donde la longitud la pone el usuario
no lo probe pero deberia ser mas o menos

#include<iostrem>
#35include<string>[

using manespace std,
int main()
{
string frase;
getline(cin, frase );
cout<<"la frase es " <<frase<<endl;
return 0;
}

Título: Re: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 06:12 AM
La primera solucion que propones no la veo muy satisfactoria, es facil agregar


cin.getline(str1, 1000000000000,'\n');


pero se ve "anti-programador" tener eso asi xD.
Me gustaria una especie de codigo que pueda manejar ese exceso de la cadena.

Probare la segunda solucion.

Título: Re: Problema con cin.getline
Publicado por: flony en 23 Agosto 2013, 06:19 AM
la primer solucion es si queres un limite de palabras...ejemplo la contraseña es de 8 digitos
la segunda es si queres que el usuario escriba hasta cansarse  :laugh:
Título: Re: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 06:23 AM
Ok, pero la cuestion esta en que si el usuario no hace caso e introduce una cadena mayor al limite que le coloque, cómo haria para manejar esa situacion y no me de error.
Título: Re: Problema con cin.getline
Publicado por: flony en 23 Agosto 2013, 06:29 AM
una opción es usa la segunda solución, recorrerla con un while y dentro del while un for  y mandarle un mensaje si se pasa, diciendo jodete el exceso de palabras no vale....o mejor para no ofenderlo decirle...che son 8 dígitos nada mas
Título: Re: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 06:50 AM
Yo entiendo, aunque si tuvieses una forma de manejar la primera situacion me gustaria saber, como el gets(), que cuando le pasas por parametro el tamaño de la cadena y el usuario escribe de mas, la funcion solamente tomara hasta el maximo que le indicaste, aunque en este caso creo q hace lo mismo y cuando va al segundo cin.getline(), lo omite, y tampoco puedo hacer algo del tipo 


while(getchar() != '\n');


antes del segundo cin.getline(), por eso quisiera saber una forma de poder solucionarlo de la forma en que lo presente, y sino, bueno tendre que hacerlo de la forma en que dijiste.
Título: Re: Problema con cin.getline
Publicado por: rir3760 en 23 Agosto 2013, 17:58 PM
Como ya te comentaron lo mejor es utilizar instancias de la clase string, con ellas los pasos son:
1) Lees la linea completa mediante string::getline.
2) Verificas su tamaño (función miembro size) y si es mayor que el permitido descartas el exceso mediante la función string::erase (http://www.cplusplus.com/reference/string/string/erase/).
Por ejemplo:
Código (cpp) [Seleccionar]
string primera;
getline(cin, primera);
if (primera.size() > max_chars) // max_chars == maximo numero de caracteres
   primera.erase(max_chars, string::npos);


Si por alguna razón debes utilizar arrays de caracteres para almacenar las lineas los pasos son:
1) Lees la linea mediante la función istream::get (http://www.cplusplus.com/reference/istream/istream/get/), su funcionamiento es idéntico a istream::getline pero con la diferencia que el carácter delimitador ('\n' a menos que se especifique otro) se queda en el bufer de la entrada estándar.
2) Descartas el resto de la linea (por lo menos el '\n') mediante la función istream::ignore (http://www.cplusplus.com/reference/istream/istream/ignore/?kw=istream%3A%3Aignore).
Por ejemplo:
Código (cpp) [Seleccionar]

const int max_chars = 5; // 4 caracteres mas el '\0'

// ...

char primera[max_chars];
cin.get(primera, max_chars);
cin.ignore(numeric_limits<int>::max(), '\n');


Un saludo
Título: Re: Problema con cin.getline
Publicado por: erest0r en 24 Agosto 2013, 03:33 AM
Muchas gracias, todas las soluciones fueron utiles, y la ultima del compañero rir3760 se acerca mas a lo que buscaba.

+1