Возможный дубликат:
Нужна помощь с getline ()
getline()
не работает, если я использую его после некоторых входов, т.е.
#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");
}
где как будто я использую getline()
на вершине входов это работает, т.е.
cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;
В чем может быть причина?
Символы извлекаются до тех пор, пока не будет (n — 1) символов
извлечен или найден символ-разделитель (который является разделителем, если это
параметр указан или ‘\ n’ в противном случае). Добыча также останавливается
если достигнут конец файла во входной последовательности или если произошла ошибка
происходит во время операции ввода.
когда cin.getline()
читает из ввода, во входном потоке остается символ новой строки, поэтому он не читает вашу c-строку. использование cin.ignore()
звонящий медведь getline()
,
cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);
Добавление к тому, что @DavidHammen сказал:
Операции по извлечению оставляют след '\n'
персонаж в потоке. С другой стороны, istream::getline()
отбрасывает это. Поэтому, когда вы звоните getline
после оператора извлечения, '\n'
это первый символ, с которым он сталкивается, и он тут же перестает читать.
Поместите это после до getline
извлечение вызова:
cin.ignore()
Более надежный способ получения ввода будет выглядеть примерно так:
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";
}
}
Вы не проверяете статус потока. std::cin
оператор извлечения потока (operator>>
) может потерпеть неудачу. Когда это происходит, поток помечается как «плохой» (failbit
, badbit
, или же eofbit
установлены). После сбоя все последующие извлечения потока в этом потоке завершатся ошибкой, если вы не очистите статус.
Научитесь быть параноиком. Всегда проверяйте статус этих отформатированных операций ввода. Вы можете, например, сгенерировать исключение или распечатать сообщение об ошибке и выйти. Единственное, что вы не должны делать, это просто предполагать, что это сработало.