Что происходит, istream :: getline читает до предела, затем останавливается. Вы не проверяете, закончил ли он, читая новую строку, поэтому, когда вы перейдете к чтению двойного значения позже, входные данные потока содержат символы, которые не могут быть преобразованы в двойные: это переводит поток в состояние сбоя.
Поскольку вы не проверяете, успешен ли ввод (в двойник), использование этого значения приводит к неопределенному поведению. Если вместо этого вы инициализируете свой double (чтобы избежать UB), вы обнаружите, что его значение не изменилось.
Хотя бывают случаи, когда вы хотите использовать istream :: getline, это не один из них: используйте std :: string и std :: getline:
std::string month1;
double rain1;
getline(std::cin, month1);
if (std::cin >> rain1) {
// input succeeded, use month1 and rain1
}
else {
// input of either month1 or rain1 failed; recover or bail (e.g. return 1;)
}
Единственная причина использовать istream :: getline - это когда вы должны ограничить возможный злонамеренный ввод из-за чрезмерного использования памяти; например строка 10 ГБ. Это не относится к простым примерам и упражнениям.