Обработка символов задача

177
30 декабря 2021, 13:10

Преобразовать исходную строку, заменив каждую из групп стоящих рядом двух или более точек многоточием (т.е. тремя точками). Ввод В первой строке содержится последовательность символов, оканчивающаяся символом перехода на новую строку. Длина последовательности не превышает 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;
}
Answer 1

Откровенно, не вижу огрех. Пока не скажете, на чем сыпется - трудно понять.
Я его просто подчистил немного, без всяких -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;
}
Answer 2

Ошибка здесь:

    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);
    }
}
Answer 3

Через regex.

int main() {
    string text = "Here are some points......... Still more points...............";
    // cout >> text;
    regex reg("\\.{2,}");
    cout << regex_replace(text, reg, "...") << endl;
}
READ ALSO
Как можно объединить три функции в одну?

Как можно объединить три функции в одну?

Я хочу объединить эти функции в одну и не знаю как это сделатьвозможно ли это

218
Свой QGraphicsEffect box-shadow (своя тень)

Свой QGraphicsEffect box-shadow (своя тень)

Как можно сделать свою тень box-shadow как в CSS, чтобы были такие же параметры как там: сдвиг по x, сдвиг по y, размытие, растяжение и цвет

146
Выполнять суммирование пока условие не выполнится

Выполнять суммирование пока условие не выполнится

В сем привет! Помогите решить задача на с++C клавиатуры вводится числа и записываются в переменные max и Del0

168
как можно упростить данный код

как можно упростить данный код

Всем привет, написал код и хочу узнать можно ли как то его ещё сильнее у компановать?

141