Problema con cin.getline

Iniciado por erest0r, 23 Agosto 2013, 02:10 AM

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

erest0r

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
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

flony

#1
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;
}

si un problema no tiene solucion entonces no es un problema...es algo inevitable

erest0r

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.

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

flony

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:
si un problema no tiene solucion entonces no es un problema...es algo inevitable

erest0r

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.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

flony

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
si un problema no tiene solucion entonces no es un problema...es algo inevitable

erest0r

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.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

rir3760

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.
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, 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.
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

erest0r

Muchas gracias, todas las soluciones fueron utiles, y la ultima del compañero rir3760 se acerca mas a lo que buscaba.

+1
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.