станд.:: getline не работает в для цикла

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

Начиная с обычного cin >> str не принимает пробелы, таким образом, я пошел бы со станд.:: getline от <строки>

Вот мой код:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local); // This simply does not work. Just skipped without a reason.
        //............................
    }

    //............................
    return 0;
}

Какая-либо идея?

5
задан drowneath 11 January 2010 в 04:29
поделиться

6 ответов

Вы можете понять, почему это не удается, если вы выводите то, что вы храните в Local (который является плохим именем переменной, кстату: P ):

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

Вы увидите, что он распечатает новую линию после > сразу после ввода вашего номера. Затем он перемещается на ввод остальных.

Это связано с тем, что getline дает вам пустую линию, останусь от ввода вашего номера. (Это читает номер, но, по-видимому, не удаляет \ N , поэтому вы остались с пустой строкой.) Вам нужно сначала избавиться от какого-либо оставшегося пробела:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    cin >> ws; // stream out any whitespace
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

это работает как и ожидалось.

Отдельная тема, возможно, это было только для фрагмента под рукой, но код имеет тенденцию быть больше , читаемый , если у вас нет с помощью пространства имен STD; Это побеждает цель пространства имен. Я подозреваю, что это было только для публикации здесь, хотя.

12
ответ дан 18 December 2019 в 10:44
поделиться

Вы попадаете в Enter? Если не получите линию, ничего не вернется, как он ждет конца строки ...

1
ответ дан 18 December 2019 в 10:44
поделиться
  • NAT, правильно инициализирован от ввода?
  • Вы не кажутся ничего не делать с Getline. Это то, что вы хотите?
  • getline возвращает ссылку на ISTREAM. Делает ли тот факт, что вы бросаете его на земле?
0
ответ дан 18 December 2019 в 10:44
поделиться

На каком компиляторе вы попробовали это? Я попробовал на VC2008 и работал нормально. Если бы я собрал тот же код на G ++ (GCC) 3.4.2. Это не работало должным образом. Ниже приведены версии в обоих компиляторах. У меня нет последнего компилятора G ++ в моей среде.

int n;
cin >> n;
string local;
getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2. 
for (int i = 0; i < n; i++)
{
    getline(cin, local);
    cout << local;
}
0
ответ дан 18 December 2019 в 10:44
поделиться

Важный вопрос: «Что вы делаете со строкой, которая дает вам представление о том, что вход был пропущен?» Или, точнее: «Почему вы думаете, что вход был пропущен?»

Если вы переходите через отладчик, вы скомпилировали с оптимизацией (что разрешено изменить инструкции)? Я не думаю, что это ваша проблема, но это возможность.

Я думаю, что более вероятно, что строка заполняется, но она не обрабатывается правильно. Например, если вы хотите передать вход в старые C функции C (например, ATOI () ), вам нужно будет извлечь строку в стиле C ( local.ch_str () ).

0
ответ дан 18 December 2019 в 10:44
поделиться

Я думаю, что вы не читаете n правильно, поэтому он преобразует как ноль. С 0 не меньше так 0, цикл никогда не выполняет.

Я бы добавил немного приборов:

int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...
1
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: