Проблема в том, что строковый литерал технически является «указателем на символьный констант». Чтение справа налево указателя на неизменяемые символы. Из-за обратной сопоставимости с 'C' это может быть автоматически приведено компилятором к 'char pointer'. Это не означает, что базовый тип изменился, и поэтому изменение базового объекта const является неопределенным поведением.
char *str1 = "Rain"; // Lie this is not a char*
char const* str9 = "Rain"; // This is the real type.
// String lieterals => "XXXXX" are char const*
Если вы хотите изменить строку, вам нужно объявить массив.
char str6[] = "Rain";
str6[0] = 'M';
*str6 = 'P';