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

Нужна помощь с getline()

Есть ли причина, почему, если в моей программе я прошу пользователя ввести, и я:

int number;
string str;
int accountNumber;

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
getline(cin, str);
cout << "Enter account number:";
cin >> accountNumber;

Почему после ввода первого номера он выводит "Enter Name", а затем сразу же "Введите номер учетной записи", прежде чем я даже доберусь до ввода моей "str" для линии getline (cin, str)? Спасибо!

4b9b3361

Ответ 1

getline(cin, str); читает новую строку, которая появляется после числа, прочитанного ранее, и сразу же возвращается с этой "строкой". Чтобы этого избежать, вы можете пропустить пробелы с помощью std::ws перед чтением имени:

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...

Обратите внимание, что это также пропускает начальные пробелы после новой строки, поэтому str не запускается с пробелами, даже если пользователь вводил их. Но в этом случае это, вероятно, особенность, а не ошибка...

Ответ 2

Попробуйте

cout << "Enter name:";
cin.ignore();
getline(cin, str);

Ответ 3

Похоже, вам нужно чтение на основе строки. Для этого вы, вероятно, захотите последовательно использовать getline, а затем проанализировать каждую строку, если вам нужно проанализировать число из строки чтения. Это делает чтение данных более последовательным.

Таким образом, вам не нужно вручную проверять конец каждой строки, чтобы гарантировать, что следующая операция чтения начинается с новой строки.

Он также упрощает добавление обработки ошибок для повторения запросов ввода.

например.

#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>

int parse_integer(const std::string& input)
{
    std::istringstream iss(input);
    int result;
    if (!(iss >> result))
    {
        // error - throw something?
    }
    return result;
}

int main()
{
    int number;
    std::string str;
    int accountNumber;

    std::string inputline;

    std::cout << "Enter number: ";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    number = parse_integer(inputline);

    std::cout << "Enter name:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    str = inputline;

    std::cout << "Enter account number:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    accountNumber = parse_integer(inputline);

    return 0;
}

Ответ 4

cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline

Ответ 5

cin >> number

только захватывает числа из буфера, он оставляет "enter" в буфере, который затем сразу же захватывается getline и интерпретируется как пустая строка (или строка только с новой строкой, я забываю).

Ответ 6

Я думаю, проблема в том, что cin >> передает символ новой строки (\n). Функция getline() предполагает, что символ новой строки является пробелом и передает его. Кто-то разместил решение, которое вы можете использовать.

Вы можете использовать манекен getline(cin, dummy); или реальную вещь cin.ignore(100,'\n');

Ответ 7

Не используйте getline(): это плохо для распределения памяти. Используйте fgets(). Смотрите ссылку на fgets.