Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2011, 15:19   #1
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию с++, перебор строки

Дано: строка некой длины (в теории не ограничено)
Задача: вытащить из строки все последовательности, начинающиеся с одного символа и заканчивающиеся на другой (пусть "$" и "*" соответственно).
Вопрос: по какому принципу делать перебор?
На данный момент написал такой код, однако терзают сомнения в том, что он будет работать правильно (см. "remove", вложенный в цикл).
Код:
        for (int i = 0; i < buffer.length() ;i++)
            {
            if (buffer.at(i) == QChar('$'))
                    {
                    inc(s_numb);
                    ii = i;
                    }
            else
                if ((buffer.at(i) == QChar('*')) & (i > ii))
                {
                    pos_s = ii;
                    pos_z = i;
                    emit(sent_to_processing(buffer.mid(pos_s + 1,pos_z - pos_s - 1)));
                    buffer.remove(pos_s,pos_z - pos_s + 1);
                    dec(s_numb);
                }
            }
Предложения которые есть у меня самого:
1) писать в отдельный массив позицию начала и длину удаляемого куска, после чего собственно прогонять по нему цикл удаления
2) по окончании цикла просто стирать все, что содержится до последнего незакрытого символа начала сообщения.

Посоветуйте, что и как делать, пожалуйста.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 29.04.2011, 16:28   #2
malinoff
Форумчанин
 
Аватар для malinoff
 
Регистрация: 08.01.2010
Сообщений: 205
По умолчанию

Проход по символам, если встречается $, значит, возможно, искомая последовательность есть, проходим дальше - есть встречается *, инкремент увеличиваем на 1, опять ищем $ и так далее
Если помог - кликни на значок весов под аватаром.
malinoff вне форума Ответить с цитированием
Старый 29.04.2011, 17:20   #3
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Можно вопрос - а к чему это? Данный функционал реализован, как раз этот код выкидывает все последовательности через сигнал в нужные процедуры, где они уже обрабатываются.

Вопрос в том, как не выстрелить себе в ногу при переходе по элементам, при, допустим, строке длиной в 10, символе "$" на 5й позиции и "*" на 9й, ибо код вырежет из строки элементы с 5 по 9й включительно, длина строки соответственно станет 5, в то время как переменная i будет иметь значение 10.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 29.04.2011, 18:03   #4
malinoff
Форумчанин
 
Аватар для malinoff
 
Регистрация: 08.01.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от Vanta11a Посмотреть сообщение
Можно вопрос - а к чему это? Данный функционал реализован, как раз этот код выкидывает все последовательности через сигнал в нужные процедуры, где они уже обрабатываются.

Вопрос в том, как не выстрелить себе в ногу при переходе по элементам, при, допустим, строке длиной в 10, символе "$" на 5й позиции и "*" на 9й, ибо код вырежет из строки элементы с 5 по 9й включительно, длина строки соответственно станет 5, в то время как переменная i будет иметь значение 10.
К вашему вопросу
Цитата:
Вопрос: по какому принципу делать перебор?
Заводите счетчик по элементам после $, затем на получившееся значение уменьшайте значение i.
*Upd Хотя, если вы храните индекс $ и индекс *, то можно i уменьшать просто на их разницу
Если помог - кликни на значок весов под аватаром.

Последний раз редактировалось malinoff; 29.04.2011 в 18:08.
malinoff вне форума Ответить с цитированием
Старый 29.04.2011, 20:54   #5
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Цитата:
Заводите счетчик по элементам после $, затем на получившееся значение уменьшайте значение i.
Вариант, если размер при каждом цикле берется заново от того, что есть на данный момент.

Да, я виноват, вопрос сформулировал неправильно. Правильная постановка - как не закосячить цикл стиранием части строки.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор для определения строки Maksval Microsoft Office Excel 8 24.12.2010 09:58
перебор в с++ Girl/C++ Общие вопросы C/C++ 3 04.10.2010 09:50
Перебор записей в БД Sanakan Помощь студентам 9 22.03.2010 21:36
перебор записей BredoZavR БД в Delphi 5 29.06.2009 17:25
Перебор с памятью artemavd Общие вопросы Delphi 12 24.05.2009 06:48