funciona - input string c++
getline no funciona correctamente? ¿Cuáles podrían ser los motivos? (3)
Posible duplicado:
getline no está pidiendo entrada?
Hay algo único que está sucediendo en mi programa. Aquí hay un conjunto de comandos:
cout << "Enter the full name of student: "; // cin name
getline( cin , fullName );
cout << "/nAge: "; // cin age
int age;
cin >> age ;
cout << "/nFather''s Name: "; // cin father name
getline( cin , fatherName );
cout << "/nPermanent Address: "; // cin permanent address
getline( cin , permanentAddress );
Cuando intento ejecutar este fragmento junto con todo el código, el programa de salida funciona como:
salida:
Enter the full name of student:
Age: 20
Father''s Name:
Permanent Address: xyz
Si se da cuenta, el programa no me preguntó el nombre completo y pasó directamente a preguntarme la edad. Luego omite también el nombre del padre y le pide la dirección permanente. Cuál podría ser la razón de ésto ?
Es difícil para mí publicar todo el código porque es demasiado grande.
Dado que no ha publicado ningún código. Voy a hacer una conjetura.
Un problema común al utilizar getline
con cin
es que getline
no ignora los caracteres de espacio en blanco.
Si se usa getline después de cin >>
, getline()
ve este carácter de nueva línea como espacios en blanco iniciales, y deja de seguir leyendo.
¿Como resolverlo?
Llame a cin.ignore()
antes de llamar a getline()
O
haga una llamada ficticia getline()
para consumir el carácter de nueva línea final del cin >>
El problema es que estás mezclando getline
con cin >>
input.
Cuando haces cin >> age;
, que obtiene la edad del flujo de entrada, pero deja espacios en blanco en el flujo. Específicamente, dejará una nueva línea en el flujo de entrada, que luego será leída por la siguiente llamada de getline
como una línea vacía.
La solución es usar solo getline
para obtener información y luego analizar la línea para obtener la información que necesita.
O para arreglar su código, puede hacer lo siguiente, por ejemplo. (Aún así tendrás que agregar el código de comprobación de errores):
cout << "Enter the full name of student: "; // cin name
getline( cin , fullName );
cout << "/nAge: "; // cin age
int age;
{
std::string line;
getline(cin, line);
std::istringstream ss(line);
ss >> age;
}
cout << "/nFather''s Name: "; // cin father name
getline( cin , fatherName );
cout << "/nPermanent Address: "; // cin permanent address
getline( cin , permanentAddress );
después de la línea cin >> age ;
aún existe el carácter de nueva línea /n
(porque presionó Entrar para ingresar el valor) en el búfer de entrada, para corregir esto, agregue una línea con cin.ignore();
despues de leer el int.