Использование getline (cin, s) после cin - PullRequest
37 голосов
/ 21 апреля 2011

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

cout << "Enter the number: ";
int number;
cin >> number;

cout << "Enter names: ";
string names;

getline(cin, names);

С помощью команды cin >> number перед командой getline() (что яугадывание - проблема), это не позволит мне вводить имена.Почему?

Я что-то слышал о команде cin.clear(), но я понятия не имею, как это работает или почему это даже необходимо.

Ответы [ 14 ]

0 голосов
/ 27 октября 2016

Я только что использовал

getline(cin >> ws,lard.i_npute);

со стандартным заголовком

#include <iostream>

в тех случаях, когда у меня были проблемы с возвратом каретки и сработал манипулятор ws.Я, вероятно, начну встраивать циклические функции как классы и использовать вызовы конструктора и деструктора как минимум.

0 голосов
/ 16 сентября 2016

вы хотите использовать cin.ignore () после ваших операторов cin, потому что вы хотите игнорировать "\ n", оставленный в буфере после получения переменной int с помощью cin.

У меня есть похожая программа, которую я использовал с похожей проблемой:

#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main() {
    int i = 4;
    double d = 4.0;
    string s = "HackerRank ";

    // Declare second integer, double, and String variables.
    int n;
    double d2;
    string str;

    // Read and save an integer, double, and String to your variables.
    cin >> n;
    cin >> d2;

    cin.ignore();

    getline(cin, str);

    // Print the sum of both integer variables on a new line.
    cout << i + n << endl;


    // Print the sum of the double variables on a new line.
    cout << d + d2 << endl;

    // Concatenate and print the String variables on a new line
    cout << s << str << endl;

    // The 's' variable above should be printed first.

    return 0;
}
0 голосов
/ 20 августа 2016

Вы можете найти нужный ответ в cppreference .

При использовании сразу после ввода через пробел, например, после int n; std::cin >> n;, getline использует символ конца строки, оставленный навходной поток по оператору >> и немедленно возвращается.Распространенным решением является игнорирование всех оставшихся символов в строке ввода с помощью cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); перед переключением на линейно-ориентированный ввод.

0 голосов
/ 03 февраля 2015
#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Enter the number: ";
    int number;
    cin >> number;
    cout << "Enter names: ";
    string names;

    // USE peek() TO SOLVE IT! ;)
    if (cin.peek() == '\n') {
        cin.ignore(1 /*numeric_limits<streamsize>::max()*/, '\n');
    }

    getline(cin, names);

    return 0;
}

Просто посмотрите вперед, используя cin.peek(), и посмотрите, все ли '\n' осталось во внутреннем буфере cin.Если так: игнорируйте это (в основном пропускайте это)

...