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


 


Tema destacado: [AIO elhacker.NET 2015] Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Ayuda error con la función getline
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda error con la función getline  (Leído 247 veces)
Guayavas

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda error con la función getline
« en: 8 Octubre 2017, 06:02 »

Hola que tal a todos los que leen esto les doy gracias de antemano por tomarse su tiempo y en especial si pueden responder a unas cuantas preguntas que tengo sobre un código que hice en c++ se los agradecía de corazón   ;-)

el cual es este:
Código
  1. #include<iostream>
  2. #include<string>
  3. #include<conio.h>
  4. using namespace std;
  5. struct informacion
  6. {
  7. char nombre[20],sex[5];
  8. int edad;
  9. }persona[10];
  10.  
  11. int main()
  12. {
  13.  
  14. int participantes;
  15. cout<<"DIGITE NUMERO DE PARTICIPANTES\n";
  16. cin>>participantes;
  17. cin.ignore();//1 Problema
  18. for(int i=0;i<participantes;i++)
  19. {
  20. cout<<"Ingrese datos de participante N-"<<i+1<<endl;
  21.         cout<<"Digite su nombre"<<endl;
  22. cin.getline(persona[i].nombre,20,'\n');//2 problema
  23. cout<<"Digite su edad"<<endl;
  24. cin>>persona[i].edad;
  25. cin.ignore();//1 problema
  26. cout<<"Digite su sexo"<<endl;
  27. cin.getline(persona[i].sex,5,'\n');//2 problema
  28. }
  29. system("cls");
  30. for(int i=0;i<participantes;i++)
  31. {
  32. cout<<"Datos de participante N-"<<i+1<<endl;
  33.    cout<<persona[i].nombre<<endl;
  34. cout<<persona[i].edad<<endl;
  35. cout<<persona[i].sex<<endl;
  36. }
  37. system("pause");
  38. }
  39.  

el cual sirve para almacenar las información de n personas e imprimirla pero cuando estaba realizándolo me surgieron 2 problemas :
(1 problema)A este le halle solución pero quisiera saber si hay otra forma de solucionar este problema no me gusta como queda ese "cin.ignore();"    ;D
(2 problema) cuando coloco mas de los caracteres máximos que este puede almacenar este rompe el ciclo y no pide mas información  :(


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.304


ASMático


Ver Perfil WWW
Re: Ayuda error con la función getline
« Respuesta #1 en: 8 Octubre 2017, 11:50 »

Acerca del ignore: Cuando haces "cin << int", como el salto de línea que introduces no es una cifra, lo deja en el stream de entrada, con lo cual hay que ignorarlo manualmente. Una opción es leer siempre con getline y transformar a un número con, por ejemplo, stoi(): http://www.cplusplus.com/reference/string/stoi/
Podrías hacer una función que llamarías: "readInt(cin)" por ejemplo.

Acerca del segundo problema, te cito la referencia de la función getline, en el apartado en el que explica la variable "n", el tamaño del buffer: http://www.cplusplus.com/reference/istream/istream/getline/
Citar
If the function stops reading because this limit is reached without finding the delimiting character, the failbit internal flag is set.
Por lo tanto, "cin" se colocará en un estado de error. Esto hace que cualquier intento de leer entrada por ahí falle (de ahí que no te vuelva a preguntar nada). Si quieres saber si falló por esto, comprueba la flag "fail": "if(cin.fail())".
Para que el stream vuelva a funcionar de manera natural, "cin.clear()", que limpia esas flags.
Aquí, como opinión personal, te diría que en lo posible, intentes evitar trabajar con arrays de caracteres y trabajes siempre con strings. Si quieres limitar el tamaño de una string a 20, basta que hagas un "substring(0, 20)" para truncarla. No es que los arrays de char sean malos, pero puedne complicar un poco las cosas. Evidentemente, si estás trabajando con ellos por practicar o algo así, no problem.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines