powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Видоизменение строки
8 сообщений из 8, страница 1 из 1
Видоизменение строки
    #39230289
ukugyul552465
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим, есть строка:
СЛОН СЛОН БАБОЧКА ОРЁЛ ОРЁЛ БАБОЧКА
Необходимо обработать её и получить на выходе вот это:
СЛОН*2 БАБОЧКА ОРЁЛ*2 БАБОЧКА

Использую string.
Разобрался с поиском подстроки по строке (find).
Не могу разобраться, как подсчитать количество вхождений определённого слова в строке до другого слова, повторить это деёствие до конца строки.

Подскажите, пожалуйста, условие цикла while для поиска в строке подстроки до инородного слова.
...
Рейтинг: 0 / 0
Видоизменение строки
    #39230450
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 От начала строки ищем пробел
2 все что до пробела копируем в буферную строку
3 ищем следующий пробел
4 если кусок строки от предыдущего пробела до свеженайденного совпадает со строкой в буфере - увеличиваем счетчик
5 если не совпадает, выводим на печать строку из буфера и счетчик.
6 если исходная строка не кончилась идем на шаг 2
...
Рейтинг: 0 / 0
Видоизменение строки
    #39230458
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ukugyul552465,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>
#include <sstream>
#include <string>

int main() {
    using namespace std;
    string input("33 11 11 11 22 22 22 22 11 11 22 11 22 22 33 33 44");
    istringstream iss(input);
    ostringstream oss;
    for(string w, p, c("\0"); getline(iss, w, ' '); p = w, c[0]++) {
        if (p != w && p.size()) {
            oss << p << "*" << +c[0] << ' ';
            c.assign("\0");
        }
        if (iss.eof()) {
            oss << w << "*" << c[0] + 1;
        }
    }
    cout << oss.str() << endl;
    return 0;
}

// 33*1 11*3 22*4 11*2 22*1 11*1 22*2 33*2 44*1
...
Рейтинг: 0 / 0
Видоизменение строки
    #39230467
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl1 От начала строки ищем пробел
2 все что до пробела копируем в буферную строку
3 ищем следующий пробел
4 если кусок строки от предыдущего пробела до свеженайденного совпадает со строкой в буфере - увеличиваем счетчик
5 если не совпадает, выводим на печать строку из буфера и счетчик.
6 если исходная строка не кончилась идем на шаг 2

Потом он спросит как быть, если одинаковые слова расположены не рядом друг с другом.
ukugyul552465, откройте K&R главу про деревья, там вы и встретите ваш пример с очень подробным разбором
...
Рейтинг: 0 / 0
Видоизменение строки
    #39230470
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Поправка: (прозевал X*1 )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
for(string w, p, c("\0"); getline(iss, w, ' '); p = w, c[0]++) {
    if (p != w && p.size()) {
        oss << p;
        if (c[0] > 1) {
            oss << "*" << +c[0];
        }
        oss << ' ';
        c.assign("\0");
    }
    if (iss.eof()) {
        oss << w;
        if (++c[0] > 1) {
            oss << "*" << +c[0];
        }
    }
}
...
Рейтинг: 0 / 0
Видоизменение строки
    #39230806
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если из постановки убрать понятие разделителей то получим вполне себе
простой и концептуальный архиватор.

P.S.

Input

Код: plaintext
1.
"бабочка бочка  слон слонопотам"



Output

Код: plaintext
1.
"ба(бочка )*2( слон)*2опотам"
...
Рейтинг: 0 / 0
Видоизменение строки
    #39231757
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делить слова по пробелам - ошибка.
у boost.locale есть итератор по словам. как он там пишет - это нетривиальная задача (например если слова на китайском).

а еще можно boost.spirit :) но он кстати плохо по словам делит (по пробельным символам).
...
Рейтинг: 0 / 0
Видоизменение строки
    #39232532
ukugyul552465
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю всех, решение нашёл.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Видоизменение строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]