Почему getline пропускает? [Дубликат]

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

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

4
задан Osama Gamal 7 May 2011 в 02:11
поделиться

3 ответа

cin >> T;

Это потребляет целое число, которое вы предоставляете на stdin.

При первом вызове:

getline(cin, line)

... вы потребляете новую строку после целого числа.

Вы можете получить cin до ignore новой строки, добавив следующую строку после cin >> T;:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

(вам понадобится #include <limits> для std::numeric_limits )

8
ответ дан Johnsyweb 3 September 2018 в 13:18
поделиться

Скорее всего, в вашем входном файле есть новая строка, и она обрабатывается немедленно, как описано на этой странице:

http://augustcouncil.com/~tgibson/tutorial/ iotips.html

Вы можете вызвать cin.ignore(), чтобы он отклонил один символ, но вы можете прочитать больше советов, так как есть предложения о том, как обращаться с чтением в числах.

3
ответ дан James Black 3 September 2018 в 13:18
поделиться

Эта строка читает только номер:

cin >> T;

Если вы хотите проанализировать ввод пользователя, вам нужно учесть, что они продолжают бить & lt; enter & gt; потому что вход буферизирован. Чтобы обойти это время, проще читать интерактивный ввод, используя getline. Затем проанализируйте содержимое строки.

std::string userInput;
std::getline(std::cin, userInput);

std::stringstream(userInput) >> T;
1
ответ дан Martin York 3 September 2018 в 13:18
поделиться