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

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

Подскажите, пожалуйста, условие цикла while для поиска в строке подстроки до инородного слова.
...
Рейтинг: 0 / 0
06.05.2016, 01:17
    #39230450
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видоизменение строки
1 От начала строки ищем пробел
2 все что до пробела копируем в буферную строку
3 ищем следующий пробел
4 если кусок строки от предыдущего пробела до свеженайденного совпадает со строкой в буфере - увеличиваем счетчик
5 если не совпадает, выводим на печать строку из буфера и счетчик.
6 если исходная строка не кончилась идем на шаг 2
...
Рейтинг: 0 / 0
06.05.2016, 04:04
    #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
06.05.2016, 06:23
    #39230467
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видоизменение строки
White Owl1 От начала строки ищем пробел
2 все что до пробела копируем в буферную строку
3 ищем следующий пробел
4 если кусок строки от предыдущего пробела до свеженайденного совпадает со строкой в буфере - увеличиваем счетчик
5 если не совпадает, выводим на печать строку из буфера и счетчик.
6 если исходная строка не кончилась идем на шаг 2

Потом он спросит как быть, если одинаковые слова расположены не рядом друг с другом.
ukugyul552465, откройте K&R главу про деревья, там вы и встретите ваш пример с очень подробным разбором
...
Рейтинг: 0 / 0
06.05.2016, 06:42
    #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
06.05.2016, 13:10
    #39230806
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видоизменение строки
Если из постановки убрать понятие разделителей то получим вполне себе
простой и концептуальный архиватор.

P.S.

Input

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



Output

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

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


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