Я пытаюсь собрать вход пользователя в строковой переменной, которая принимает пробелы для указанного количества времени.
Начиная с обычного 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;
}
Какая-либо идея?
Вы можете понять, почему это не удается, если вы выводите то, что вы храните в 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;
Это побеждает цель пространства имен. Я подозреваю, что это было только для публикации здесь, хотя.
Вы попадаете в Enter? Если не получите линию, ничего не вернется, как он ждет конца строки ...
На каком компиляторе вы попробовали это? Я попробовал на 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;
}
Важный вопрос: «Что вы делаете со строкой, которая дает вам представление о том, что вход был пропущен?» Или, точнее: «Почему вы думаете, что вход был пропущен?»
Если вы переходите через отладчик, вы скомпилировали с оптимизацией (что разрешено изменить инструкции)? Я не думаю, что это ваша проблема, но это возможность.
Я думаю, что более вероятно, что строка заполняется, но она не обрабатывается правильно. Например, если вы хотите передать вход в старые C функции C (например, ATOI ()
), вам нужно будет извлечь строку в стиле C ( local.ch_str ()
).
Я думаю, что вы не читаете n
правильно, поэтому он преобразует как ноль. С 0 не меньше так 0, цикл никогда не выполняет.
Я бы добавил немного приборов:
int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...