Оставить в строке по одному пробелу после слов и по два после каждого конца предложений
Функции на вход передается строка. Необходимо сделать так, чтобы в этой строке между словами оставался один пробел, а между предложениями-2.
Есть функция
void Replace(string s)
{
s.replace(1, s.find(+" "), " ");
s.replace( s.find(". "), " ");
cout << s;
}
Первый реплейс оставляет в строке везде по одному пробелу, а вот как составить второй так, чтобы он и из строки ничего не вырывал и после точек по два пробела оставлял-я, если честно не догадываюсь, хотя задача предельно тривиальная.
Ответы (1 шт):
Посредством функций членов std::string, можно сделать, но не так то просто. Во первых постоянно нужно проверить не закончилась ли строка? Во вторых нужно искать не с самого начала, а с того места где удалили, и учесть количество удаленных элементов. Если учесть также, что предложение может закончится не только точкой, то чтобы оставить между предложениями по два пробела, придется написать код типа:
size_t p = s.find(' ',s.find_first_of(".?!")),
q{}, k{};
while (p != s.npos) {
//ищем начало следующего предложения
q = s.find_first_not_of(' ', ++p);
//новое предложение всегда начинается с большой буквы
if (q != s.npos && isupper(s[q])) {
k = q - p;
//если после первого пробела больше одного пробела
if (k > 1) {
s.erase(p, --k);
//после удаления, индекс начала
//следующего предложения уменьшится на k - 1
q -= k;
}
}
//ищем конец следующего предложения
p = s.find(' ', s.find_first_of(".?!", q));
}