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

Использование getline() в С++

У меня есть проблема с использованием метода getline для получения сообщения, которое пользователь вводит, я использую что-то вроде:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

Однако он не останавливается, чтобы получить выходное значение, что с этим не так?

4b9b3361

Ответ 1

Если вы используете getline() после cin >> something, вам нужно сбросить символ новой строки из буфера между ними. Вы можете сделать это, используя cin.ignore().

Это будет примерно так:

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

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

Ответ 2

Если у вас есть только одна новая строка на входе, просто выполните

std::cin.ignore();

будет работать нормально. Он считывает и отбрасывает следующий символ из ввода.

Но если у вас есть что-то еще на входе, помимо новой строки (например, вы читаете одно слово, но пользователь вводит два слова), тогда вам нужно сделать

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

См. эта ссылка функции ignore.

Чтобы быть еще более безопасным, сделайте вторую альтернативу выше в цикле до тех пор, пока gcount не вернет нуль.

Ответ 3

У меня были похожие проблемы. Единственным недостатком является то, что с cin.ignore(), вы должны нажать ввод еще 1 раз, что портит программу.

Ответ 4

int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it a file)
        input.close();
    }
}

Ответ 5

Я думаю, что вы не приостанавливаете программу до ее окончания, поэтому вывод, который вы ставите после получения inpus, не отображается прямо на экране?

делать:

getchar();

до конца программы

Ответ 6

Код верный. Проблема должна лежать где-то в другом месте. Попробуйте минималистский пример из документации std:: getline.

main ()
{
    std::string name;

    std::cout << "Please, enter your full name: ";
    std::getline (std::cin,name);
    std::cout << "Hello, " << name << "!\n";

    return 0;
}