Вот ваш код, несколько уменьшенный для иллюстрации проблемы
#include <iostream>
#include <string>
void f(std::string s) {
if (s.size() < 1)
std::cout << "s[0] would correctly throw out_of_range exception" << std::endl;
}
int main()
{
std::string s;
(std::cin).ignore('\n', INT_MAX);
getline(std::cin, s);
std::cout << s.size() << std::endl;
f(s);
}
Я настроил его для работы с вводом, перенаправленным из файла sample.txt со следующей строкой
short
Вывод
0 с [0] правильно выдает исключение out_of_range
Просмотр документации http://www.cplusplus.com/reference/istream/istream/ignore/
istream& ignore (streamsize n = 1, int delim = EOF);
Значение, которое вы передали n, равно '\ n', то есть символ 10 (в ascii), поэтому вы сказали ему игнорировать 10 символов, как предыдущий комментарий сказал. Поэтому, когда он читает ввод из 5 символов, игнорирование пропускает все это, не оставляя ничего для чтения getline. Это, в свою очередь, приводит к исключению вне диапазона, когда вы пытаетесь посмотреть на s [0], который на самом деле находится вне диапазона.
Если вы проверяете s.size () в функции, то Вы можете не смотреть на s [0]. Просто вернись немедленно, может быть? Ваши функции всегда должны безопасно обрабатывать непредвиденные вводы, такие как пустая строка.
Если вы закомментируете игнорирование, тогда вы прочтете полный ввод и получите то, что ожидали, предполагая, что введенный вами вклад был именно тем, что вы хотели. По крайней мере, это то, что происходит в моей сборке.
Если вы не получаете ввод от getline, могут быть и другие вещи, о которых вы не сообщили нам в своем коде, например, в c ++ getline () не ждет ввода от консоли при многократном вызове или Постоянное чтение двух строк с использованием функции getline в c ++