funciona - input string c++
getline() no funciona si se usa después de algunas entradas (3)
Posible duplicado:
Necesito ayuda con getline ()
getline()
no funciona, si lo uso después de algunas entradas, es decir,
#include<iostream>
using namespace std;
main()
{
string date,time;
char journal[23];
cout<<"Date:/t";
cin>>date;
cout<<"Time:/t";
cin>>time;
cout<<"Journal Entry:/t";
cin.getline(journal,23);
cout<<endl;
system("pause");
}
donde como si utilizara getline()
en la parte superior de las entradas, funciona, es decir,
cout<<"Journal Entry:/t";
cin.getline(journal,23);
cout<<"Date:/t";
cin>>date;
cout<<"Time:/t";
cin>>time;
¿Cuál podría ser la razón?
Los caracteres se extraen hasta que se extraen (n - 1) caracteres o se encuentra el carácter delimitador (que se delimita si se especifica este parámetro, o ''/ n'' de lo contrario). La extracción también se detiene si se llega al final del archivo en la secuencia de entrada o si se produce un error durante la operación de entrada.
Cuando cin.getline()
lee desde la entrada, queda un carácter de nueva línea en la secuencia de entrada, por lo que no lee su c-string. Use cin.ignore()
beore llamando a getline()
.
cout<<"Journal Entry:/t";
cin.ignore();
cin.getline(journal,23);
Añadiendo a lo que dijo @DavidHammen:
Las operaciones de extracción dejan el carácter ''/n''
final en el flujo. Por otro lado, istream::getline()
descarta. Entonces, cuando llama a getline
después de un operador de extracción, ''/n''
es el primer carácter que encuentra y deja de leer allí mismo.
Ponga esto después de antes de la extracción de llamadas getline
:
cin.ignore()
Una forma más robusta de tomar información sería algo como esto:
while (true) {
cout<<"Time:/t";
if (cin>>time) {
cin.ignore(); // discard the trailing ''/n''
break;
} else {
// ignore everything or to the first ''/n'', whichever comes first
cin.ignore(numeric_limits<streamsize>::max(), ''/n'');
cin.clear(); // clear the error flags
cout << "Invalid input, try again./n";
}
}
No estás comprobando el estado de la transmisión. El operador de extracción de flujo de std::cin
( operator>>
) puede fallar. Cuando lo hace, el flujo se marca como "malo" (se establecen failbit
, badbit
o eofbit
). Una vez "incorrecto", todas las extracciones de flujo subsiguientes en ese flujo fallarán a menos que borre el estado.
Aprende a ser un programador paranoico. Siempre verifique el estado de esas operaciones de entrada formateadas. Podría, por ejemplo, lanzar una excepción o imprimir un mensaje de error y salir. Lo único que no debes hacer es simplemente asumir que funcionó.