cin.getline () пропускает ввод в C ++

Если я использую следующий код, getline не берет последний ввод (для последней итерации цикла «для» он просто пропускает его) -

<code>int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c); // here it skips the input for last iteration
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}
</code>

Чтобы избавиться от этого, я поставил cin.ignore () после getline. Теперь он принимает все входные данные, но я столкнулся с новой проблемой -

<code>#include<iostream>
#include<string>
#include<map>
#include<set>
#include<sstream>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c);
            cin.ignore();
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}
</code>

Новая проблема заключается в том, что при получении c2 первый символ строки удаляется. Например, если я дам «Англия Джейн Доу» в качестве входных данных для getline, в c2 я получу "ngland".

Как избавиться от этой проблемы сейчас?

 alexisdm18 апр. 2012 г., 01:09
возможный дубликатusing getline(cin, s) after cin
 Martin York18 апр. 2012 г., 00:15
(*ci).first легче читать какci->first
 Kerrek SB18 апр. 2012 г., 00:10
смешивание>> а такжеgetline деликатный В любом случае, вы никогдаcheck результат любого из них, так почему вы ожидаете, что ваш код будет работать?

Ответы на вопрос(4)

Решение Вопроса

Это:

cin>>n;

Читает только номер.
Это оставляет в конце'\n' в потоке.

Итак, ваш первый звонокgetline() читает пустую строку, содержащую только'\n'

Лучше не смешивать использованиеoperator>> а такжеstd::getline(), Вы должны быть очень осторожны с тем, оставили ли вы новую строку в потоке. Я считаю, что проще всего всегда читать строки от пользователя. Затем разберите строку отдельно.

 std::string  numnber;
 std::getline(std::cin, number);

 int n;
 std::stringstream numberline(number);
 numberline >> n;
 theharshest18 апр. 2012 г., 10:53
Спасибо за приятное объяснение! :)

просто пиши

cin.ignore();

после вашего последнего & quot; & gt; & quot; оператор. & Quot; & GT; & GT; & Quot; оператор покидает символ новой строки & quot; \ n & quot; во входном потоке битов, который необходимо очистить перед тем, как принимать входные данные.

вашcin.ignore() находится не в том месте. getline не покидает трейлинг\n символ новой строки, это>> символ, который делает это.

То, что вы, вероятно, хотите

cin>>n;
cin.ignore();
 18 апр. 2012 г., 01:04
cin.ignore игнорирует только 1 символ, вам нужно игнорировать все символы, пока\n символ новой строки.

на самом деле в буфере cin \ n осталось от последнего cin, поэтому getline принимает этот символ \ n и завершается; игнорировать содержимое буфера перед getline ...

cin.ignore ();

getling (cin, string_name);

// это будет работать гладко

Ваш ответ на вопрос