La Web del Programador: Comunidad de Programadores
 
    Pregunta:  37826 - PROBLEMA CON CIN
Autor:  M JS
Hola:
Quisiera saber si alguien me puede explicar porque funciona lo siguiente

Para evitar el problema de pisar memoria cuando leo una cadena con el cin, por ejemplo cin>> nombre utilizo cin.getline(nombre,20), esto corta la entrada a memoria cuando tengo 19 caracteres tipeados. Pero si se trata de ingresar mas de 19 caracteres y luego hay otra lectura de una cadena o de un numero por ejemplo
cin>> edad o cin.getline(apellido,20), en cualquiera de los dos casos sucede lo mismo levanta los caracteres pendientes en el caso de la cadena o el enter en el caso del numero y me saltea la lectura, buscando en el help encontre el metodo cin.clear() con el que crei que lo hiba a solucionar pero es como si no hiciera nada, segui buscando y encontre otro metodo el cin.tellg(). Ahora bien segun el help de borland lo unico que hace este metodo es devolver la longitud del flujo de entrada. Alguien me puede explicar porque funciona o que es exactamente lo que hace este metodo. Y si hay otra forma de hacerlo.
Por favor no me contesten que con el flush, ya que no quiero usar la biblioteca stdio. Estoy tratando de usar solo cosas de C++.

El codigo quedaria:
cout <<"Ingrese Nombre"; cin.getline(Nombre,20); cin.tellg();
cout<<"Ingrese Apellido"; cin.getline(Apellido,20); cin.tellg();
cout<<"Ingrese Edad"; cin>>Edad;

Desde ya muchas gracias.

  Respuesta:  Christian
Hola, no creo que el problema sea ese, tal vez te convendria trabajar con strings dinamicos asi no tendrias que restringir la entrada de caracteres, como declaras vos el string? hay varias formas, la mejor es char *nombre; (por ejemplo). Si queres te puedo ayudarte o al menos tratar de ayudarte, si queres mandame el pedazo de codigo en el que tenes problema con un ejemplo y lo veo. Tal vez te entendi mal en lo que tenes problema o estas buscando hacer otra cosa, pero pienso que si haces lo siguiente, se te va a solucionar el problema, y si no, mandame el codigo...

//no se que haras despues con esos datos, pero supongamos que
//seteas los datos de un objeto "persona"

char *nombre,*apellido;
int edad;
persona p;
cout<<"ingrese el nombre: "; cin>>nombre;
cout<<"ingrese el apellido: "; cin>>apellido;
cout<<"ingrese la edad: "; cin>>edad;
p.setNombre(nombre);
p.setApellido(apellido);
p.setNombre(edad);

Espero que te sirva lo q te dije, cualquier duda mi mail es [email protected]

Chau. Suerte.