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
#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 ;-)
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"...
No sirve el cin.clear();
Pero encontre otra alternativa lo dejo aqui, por ahi a alguien le sirve
#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
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.
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
#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.
Prueba con cin.ignore() o cin >> ws o while(getchar!='\n')