Problemas limitando caracteres en el ingreso

Iniciado por Beginner Web, 8 Julio 2018, 18:10 PM

0 Miembros y 2 Visitantes están viendo este tema.

Beginner Web

Bueno aqui estuve intentando ingresar cadenas mayores a 20 y que solo guarde los primeros 20 como maximo pero no he podido hacerlo, me salta de linea por problemas en el buffer y no tengo idea de como resolverlo aqui el codigo

Código (cpp) [Seleccionar]

#include <iostream>
#include <stdio.h>  //Librerias
#include <stdlib.h> //del C :v

using namespace std;

const int MAX=20;
typedef char tcad[20];
typedef struct{
tcad nombre;
tcad apellido;
int edad;
int DNI;
}templeado;

void cargar(templeado &empleado);
void mostrar(templeado empleado);

int main()
{
templeado EMPLEADO;
cargar(EMPLEADO);
mostrar(EMPLEADO);
system("pause");
return 0;
}

void cargar(templeado &empleado)
{
cout << "Ingrese nombre  : ";
cin.getline(empleado.nombre,MAX+1);
cout << "Ingrese apellido: ";
cin.getline(empleado.apellido,MAX+1);
cout << "Ingrese edad    : ";
cin >> empleado.edad;
fflush(stdin);
cout << "Ingrese DNI     : ";
cin >> empleado.DNI;
}
void mostrar(templeado empleado)
{
cout << "DATOS EMPLEADO" << endl;
cout << "Nombre  : " << empleado.nombre << endl;
cout << "Apellido: " << empleado.apellido << endl;
cout << "Edad    : " << empleado.edad << endl;
cout << "DNI     : " << empleado.DNI << endl;
}



Datos de entrada: Nelson growwwwwwwwwwwwwwwwwwwwww
Datos de salida: Tremendo desbordamiento

Podria hacerlo con funciones propias pero el profesor no lo quiere asi, alguna sugerencia, desde ya gracias  ;-)


7w7

ivancea96

2 cosas importantes:

  • Cuando ese getline deja de leer porque se ha llenado el buffer, activa el "failbit", el cual puedes ver si está activado con "cin.fail()", que retorna un bool. Con esto puedes ver si se ha leído el salto de línea o no.
  • Para volver a usar cin despues de que una flag de error haya sido establecida, puedes usar "cin.clear()"

Dicho esto, una posible opción sería, tras la lectura, comprobar si está el failbit activado. Y luego, leer con getline en bucle hasta que el failbit no se establezca, lo que significaría que ya se leyó el salto de línea.

Esta lógica la puedes meter en una función para evitar escribirla siempre.


Otro detalle: En C++, en vez de las cabeceras de C,e s preferible usar las cabeceras de C++ que vienen de C, que son las mismas con una "c" al principio y sin el ".h": "stdio.h" => "cstdio"...

Beginner Web

No sirve el cin.clear();
Pero encontre otra alternativa lo dejo aqui, por ahi a alguien le sirve

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
#include <stdio.h> //Libreria para utilizar la funcion gets, fgets, fflush;

using namespace std;

int main(){
char primera[10], segunda[10];
cout << "Primera: ";
fgets(primera, 11, stdin);
fflush(stdin);
cout << "Segunda: ";
fgets(segunda, 11, stdin);
fflush(stdin);
cout << primera << endl;
cout << segunda << endl;
system("pause");
}


Ahora si puedo poner tranquilamente: Nelson Growwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
7w7

MAFUS

Pues esto te funcionará en pocos sitios: como hemos dicho muchas veces el fflush, dice el estándar, solo está asegurado para flujos de salida. Para los flujos de entrada, como stdin, es a libre albedrío del creador del compilador que funcione.

ivancea96

Cita de: Beginner Web en  9 Julio 2018, 05:17 AM
No sirve el cin.clear();
Pero encontre otra alternativa lo dejo aqui, por ahi a alguien le sirve

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
#include <stdio.h> //Libreria para utilizar la funcion gets, fgets, fflush;

using namespace std;

int main(){
char primera[10], segunda[10];
cout << "Primera: ";
fgets(primera, 11, stdin);
fflush(stdin);
cout << "Segunda: ";
fgets(segunda, 11, stdin);
fflush(stdin);
cout << primera << endl;
cout << segunda << endl;
system("pause");
}


Ahora si puedo poner tranquilamente: Nelson Growwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

El cin.clear(), como dije, limpia flags de error, no resuelve tu problema.

MAFUS

Prueba con cin.ignore() o cin >> ws o while(getchar!='\n')