getline() не работает, если используется после некоторых входов [дублировать]
Возможные Дубликаты:
нужна помощь с 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;
в чем может быть причина?
3 ответов
символы извлекаются до тех пор, пока либо (n - 1) символы не были извлеченный или разделяющий символ найден (который является delim, если это параметр указан, или' \n ' в противном случае). Добыча останавливается если во входной последовательности достигнут конец файла или произошла ошибка происходит во время операции ввода.
, когда cin.getline()
считывает с входа, во входном потоке остается символ новой строки, поэтому он не читает вашу c-строку. Использовать cin.ignore()
быть вызов getline()
.
cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);
добавление к тому, что @DavidHammen сказал:
операции извлечения оставляют трейлинг '\n'
символ в потоке. С другой стороны,--2--> отбрасывает его. Поэтому, когда вы звоните 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";
}
}
вы не проверяете состояние потока. The std::cin
оператор извлечения потока (operator>>
) может произойти сбой. Когда это происходит, поток помечается как "плохой" (failbit
, badbit
или eofbit
установить). Как только "плохо", все последующие извлечения потока в этом потоке завершатся неудачей, если вы не очистите статус.
учитесь быть параноиком программистом. Всегда проверяйте состояние этих отформатированных операций ввода. Вы можете, например, создать исключение или распечатать сообщение об ошибке и выйти. Единственное, что ты ... не следует просто предполагать, что это сработало.