Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 8 Julio 2018, 18:10 pm



Título: Problemas limitando caracteres en el ingreso
Publicado por: Beginner Web en 8 Julio 2018, 18:10 pm
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
  1. #include <iostream>
  2. #include <stdio.h>  //Librerias
  3. #include <stdlib.h> //del C :v
  4.  
  5. using namespace std;
  6.  
  7. const int MAX=20;
  8. typedef char tcad[20];
  9. typedef struct{
  10. tcad nombre;
  11. tcad apellido;
  12. int edad;
  13. int DNI;
  14. }templeado;
  15.  
  16. void cargar(templeado &empleado);
  17. void mostrar(templeado empleado);
  18.  
  19. int main()
  20. {
  21. templeado EMPLEADO;
  22. cargar(EMPLEADO);
  23. mostrar(EMPLEADO);
  24. system("pause");
  25. return 0;
  26. }
  27.  
  28. void cargar(templeado &empleado)
  29. {
  30. cout << "Ingrese nombre  : ";
  31. cin.getline(empleado.nombre,MAX+1);
  32. cout << "Ingrese apellido: ";
  33. cin.getline(empleado.apellido,MAX+1);
  34. cout << "Ingrese edad    : ";
  35. cin >> empleado.edad;
  36. fflush(stdin);
  37. cout << "Ingrese DNI     : ";
  38. cin >> empleado.DNI;
  39. }
  40. void mostrar(templeado empleado)
  41. {
  42. cout << "DATOS EMPLEADO" << endl;
  43. cout << "Nombre  : " << empleado.nombre << endl;
  44. cout << "Apellido: " << empleado.apellido << endl;
  45. cout << "Edad    : " << empleado.edad << endl;
  46. cout << "DNI     : " << empleado.DNI << endl;
  47. }


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  ;-)




Título: Re: Problemas limitando caracteres en el ingreso
Publicado por: ivancea96 en 8 Julio 2018, 18:52 pm
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"...


Título: Re: Problemas limitando caracteres en el ingreso
Publicado por: 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
  1. #include <iostream>
  2. #include <cstring>
  3. #include <stdio.h> //Libreria para utilizar la funcion gets, fgets, fflush;
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8. char primera[10], segunda[10];
  9. cout << "Primera: ";
  10. fgets(primera, 11, stdin);
  11. fflush(stdin);
  12. cout << "Segunda: ";
  13. fgets(segunda, 11, stdin);
  14. fflush(stdin);
  15. cout << primera << endl;
  16. cout << segunda << endl;
  17. system("pause");
  18. }

Ahora si puedo poner tranquilamente: Nelson Growwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww


Título: Re: Problemas limitando caracteres en el ingreso
Publicado por: MAFUS en 9 Julio 2018, 11:17 am
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.


Título: Re: Problemas limitando caracteres en el ingreso
Publicado por: ivancea96 en 10 Julio 2018, 22:53 pm
No sirve el cin.clear();
Pero encontre otra alternativa lo dejo aqui, por ahi a alguien le sirve

Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <stdio.h> //Libreria para utilizar la funcion gets, fgets, fflush;
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8. char primera[10], segunda[10];
  9. cout << "Primera: ";
  10. fgets(primera, 11, stdin);
  11. fflush(stdin);
  12. cout << "Segunda: ";
  13. fgets(segunda, 11, stdin);
  14. fflush(stdin);
  15. cout << primera << endl;
  16. cout << segunda << endl;
  17. system("pause");
  18. }

Ahora si puedo poner tranquilamente: Nelson Growwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

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


Título: Re: Problemas limitando caracteres en el ingreso
Publicado por: MAFUS en 11 Julio 2018, 14:05 pm
Prueba con cin.ignore() o cin >> ws o while(getchar!='\n')