Ayuda error con la función getline

Iniciado por Guayavas, 8 Octubre 2017, 06:02 AM

0 Miembros y 1 Visitante están viendo este tema.

Guayavas

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 (cpp) [Seleccionar]

#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
struct informacion
{
char nombre[20],sex[5];
int edad;
}persona[10];

int main()
{

int participantes;
cout<<"DIGITE NUMERO DE PARTICIPANTES\n";
cin>>participantes;
cin.ignore();//1 Problema
for(int i=0;i<participantes;i++)
{
cout<<"Ingrese datos de participante N-"<<i+1<<endl;
         cout<<"Digite su nombre"<<endl;
cin.getline(persona[i].nombre,20,'\n');//2 problema
cout<<"Digite su edad"<<endl;
cin>>persona[i].edad;
cin.ignore();//1 problema
cout<<"Digite su sexo"<<endl;
cin.getline(persona[i].sex,5,'\n');//2 problema
}
system("cls");
for(int i=0;i<participantes;i++)
{
cout<<"Datos de participante N-"<<i+1<<endl;
    cout<<persona[i].nombre<<endl;
cout<<persona[i].edad<<endl;
cout<<persona[i].sex<<endl;
}
system("pause");
}


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  :(

ivancea96

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/
CitarIf 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.