elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas limitando caracteres en el ingreso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas limitando caracteres en el ingreso  (Leído 2,786 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Problemas limitando caracteres en el ingreso
« 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  ;-)




En línea

7w7
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problemas limitando caracteres en el ingreso
« Respuesta #1 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"...


En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Problemas limitando caracteres en el ingreso
« Respuesta #2 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
En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problemas limitando caracteres en el ingreso
« Respuesta #3 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.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problemas limitando caracteres en el ingreso
« Respuesta #4 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.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problemas limitando caracteres en el ingreso
« Respuesta #5 en: 11 Julio 2018, 14:05 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Telefónica esta limitando rapidshare y megaupload? « 1 2 ... 5 6 »
Foro Libre
T0rete 51 30,817 Último mensaje 31 Enero 2011, 01:15 am
por chillinfart
limitando cantidad de digitos en jtextfield Netbeans
Java
jelsir 3 3,229 Último mensaje 30 Julio 2016, 22:41 pm
por Once
Firefox matará Flash un poco más limitando (aún) más su uso
Noticias
wolfbcn 0 1,118 Último mensaje 17 Mayo 2017, 20:57 pm
por wolfbcn
Problemas con for y concatenar caracteres.
Java
#Aitor 2 3,627 Último mensaje 29 Junio 2017, 14:43 pm
por #Aitor
Problemas de ingreso
PHP
jacarvy 5 4,110 Último mensaje 22 Mayo 2021, 01:26 am
por jacarvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines