variable funciona dev c++ visual-c++ getline

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.