Подтвердить что ты не робот

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() поверх входов, он работает i.e.

cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;

В чем может быть причина?

4b9b3361

Ответ 1

Символы извлекаются до тех пор, пока символы (n - 1) не будут извлечен или обнаружен разделительный символ (что является delim, если это параметр указан, или '\n' в противном случае). Экстракция также прекращается если конец файла достигнут во входной последовательности или если ошибка происходит во время операции ввода.

Когда cin.getline() читает с ввода, во входном потоке остается символ новой строки, поэтому он не читает вашу c-строку. Используйте cin.ignore() вызов beore getline().

cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);

Ответ 2

Добавление к тому, что сказал @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";
    }
}

Ответ 3

Вы не проверяете статус потока. Оператор извлечения потока std::cin (operator>>) может выйти из строя. Когда это происходит, поток помечен как "плохой" (failbit, badbit или eofbit установлены). После "плохого" все последующие потоки в этом потоке потерпят неудачу, если вы не очистите статус.

Научитесь быть параноидальным программистом. Всегда проверяйте статус этих форматированных операций ввода. Вы могли бы, например, выбросить исключение, или распечатать сообщение об ошибке и выйти. Единственное, что вам не следует делать, это просто предположить, что это сработало.