Преобразовать исходную строку, заменив каждую из групп стоящих рядом двух или более точек многоточием (т.е. тремя точками). Ввод В первой строке содержится последовательность символов, оканчивающаяся символом перехода на новую строку. Длина последовательности не превышает 256. Вывод Вывести измененную строку.
Примеры ввода:
Here are some points......... Still more points...............
Here are some points... Still more points...
Проходит не все тесты, не знаю в чем ошибка.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin , s);
auto pos1 = s.find('.');
auto pos2 = s.find_first_not_of('.', pos1);
while (pos1 != -1)
{
if(s[pos1] == '.' && pos1 + 1 < s.size() && s[pos1 + 1] == '.')
{
if (pos2 == -1)
pos2 = s.size();
s.replace(pos1, pos2-pos1, "...");
}
pos1 = s.find('.', pos1+3);
pos2 = s.find_first_not_of('.', pos1);
}
cout << s << endl;
}
Откровенно, не вижу огрех. Пока не скажете, на чем сыпется - трудно понять.
Я его просто подчистил немного, без всяких -1
вместо npos
, например.
string ellipsis(string s)
{
auto pos1 = s.find('.');
while(pos1 != s.npos)
{
size_t pos2 = s.npos;
if(pos1 + 1 < s.size() && s[pos1 + 1] == '.')
{
pos2 = s.find_first_not_of('.', pos1 + 1);
if (pos2 == s.npos)
pos2 = s.size();
s.replace(pos1, pos2-pos1, "...");
}
pos1 = s.find('.', pos2);
}
return s;
}
Но можно предложить другой способ, с использованием КА? Да, для данной простейшей задачи он длиннее, но для задач посложнее - самое то :), особенно если прямо построить таблицу переходов, а не мучиться со всеми этими if-else
...
string ellipsis(const string& s)
{
int state = 0;
string r;
for(char c: s)
{
if (c == '.')
{
if (++state > 2) state = 2;
}
else
{
if (state == 1) r += ".";
else if (state == 2) r += "...";
r += c;
state = 0;
}
}
if (state == 1) r += ".";
else if (state == 2) r += "...";
return r;
}
Ошибка здесь:
if(s[pos1] == '.' && pos1 + 1 < s.size() && s[pos1 + 1] == '.')
{
if (pos2 == -1)
pos2 = s.size();
s.replace(pos1, pos2-pos1, "...");
}
pos1 = s.find('.', pos1+3); // вот здесь, если выше нашли одну точку,
// то не глядя на три символа смещаетесь
pos2 = s.find_first_not_of('.', pos1);
Могу предложить такой вариант:
auto begin = s.find('.', s.npos);
while(begin != s.npos && s.size() > begin + 1)
{
auto end = s.find_first_not_of('.', begin + 1);
if (s.npos == end)
{
end = s.size();
}
const auto length = end - begin;
if (length < 2)
{
begin = s.find('.', end);
}
else
{
s.replace(begin, length, "...");
begin = s.find('.', begin + 3);
}
}
Через regex.
int main() {
string text = "Here are some points......... Still more points...............";
// cout >> text;
regex reg("\\.{2,}");
cout << regex_replace(text, reg, "...") << endl;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я хочу объединить эти функции в одну и не знаю как это сделатьвозможно ли это
Как можно сделать свою тень box-shadow как в CSS, чтобы были такие же параметры как там: сдвиг по x, сдвиг по y, размытие, растяжение и цвет
В сем привет! Помогите решить задача на с++C клавиатуры вводится числа и записываются в переменные max и Del0
Всем привет, написал код и хочу узнать можно ли как то его ещё сильнее у компановать?