Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
Более интересен случай с заменой всех таких подстрок в одной строке. Данная задача интересна как с точки зрения вариаций постановки, так и с точки зрения реализации. С большой долей вероятности всё это уже реализовано, но более интересно решить эту задачу самому(к сожалению мне сейчас нужно готовиться к отлету послезавтра, потому просто нет времени((). Но тем не менее я напишу свои мысли по поводу постановки и возможных вариантов решения этой задачи. 1.Нам дана строка и подстрока, нужно заменить все подстроки в исходной строке один раз. В лоб данная постановка решается решается следующим образом: идём по строке, встретили подстроку, операции аллоцирования, вставка новой подстроки, идём дальше.. Однако выше я встретил справедливое замечание по поводу того что слишком часто перевыделять память не стоит, по причине ресурсоёмкости данной операции. Таким образом, хорошо было бы сразу узнать сколько нам нужно выделить памяти. А уже потом проводить замены. Как это можно узнать ? Нужно пройтись по массиву символов, и узнать сколько потребуется замен. А далее что ? Проходить второй раз, снова искать индексы начала подстрок для замены ? Мне такой вариант не кажется самым хорошим. Потому можно было в первом проходе сохранить в массиве индексы начала подстрок для замены. Но мы не знаем сколько таких элементов будет в массиве, потому снова мы приходим к многократным операция аллоцирования(я беру общий случай, потому количество этих операций может быть например 10!, если нас массив соответствующего размера). Это тоже не очень хорошо. Потому можно выделить сразу например 10^5 байт под этот массив, и если не будет хватать, то увеличивать его в двое по мере необходимости. Вот такой вариант стоит отметить. Хотя тут у нас появляется побочная сложность, а это нам не очень нужно. Есть другой вариант, пусть мощность (количество элементов в массиве символом), равна например p. Можно создать битовый массив(а это можно сделать ?) мощностью p, и во время поиска подстрок в строке записывать в соответствующий бит значений 1, например, которое будет нам показывать что тут нужна замена. Но опять таки, при больших объёмах памяти, у нас появляются новые траты памяти. И если мы можем создать битовый массив, то мы затратим p+p/8 вместо p байт(это ещё терпимо), а если битовый массив создать нельзя, то мы тратим памяти в два раза больше. 2. Нам дана строка и подстрока, нужно заменить все подстроки циклически. Тут снова идёт разброс по вариантам постановки и реализации, потому писать пока не буду. Нужно подробно описывать нюансы, например такой: у нас есть строка abcabcabc, нужно заменить подстрок abcabc на 123, что в какой порядке менять ? PS битовый массив создать можно, по крайней мере мы можем его имитировать. если не ошибаюсь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2014, 06:27 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, ты протестировал тот кейс с заменой строки внутри литерала который я приводил выше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2014, 12:31 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДанная задача интересна как с точки зрения вариаций постановки, так и с точки зрения реализации. Нет. Неинтересна. Книжники и Фарисеи давно уже прописали это в свои пергаменты. Читай в поисковике по следующим ключевым словам. Алгоритм Кнута — Морриса — Пратта Бойера — Мура Ахо — Корасик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2014, 12:53 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
не проверял. завтра проверю, не очень понял где должны быть проблемы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2014, 15:31 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, смотри внимательно мой пост 16608361 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2014, 15:41 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
Видимо плохо прочитал, но в чём может быть проблема не понял ( Вот что я сделал(хотя мне не нравится как тут вызывается функция) Код: plaintext 1. 2. 3. 4. 5. 6. 7. результат прикрепил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 01:55 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
gera3323SashaMercuryЗачем вы просите памяти на 1 больше чем нужно ? Раньше функция по другому немного была устроена. если не указать один символ, то она зависает. просто не убрал это. 2. сама функция расположена в классе и буфер там. Я и этот код просто скопировал и вставил сюда. char *buf = NULL; buf = (char*)realloc( buf, len_str ); почему не выделяете память в одну строку через malloc ? память выделяется в конструкторе. а перераспределяется( в случаи если ее мало) в другой функции перед вызовом str_replace и другими. 3. Зачем вы ставите ; после окончания блоков операторов ? такой стиль. что в этом плохого ? 4. Покажите квалификаторами ваше отношение к входным параметрам. Какие из них меняются функцией, а какие нет. const дает ошибку. _in_ что ли ? 5. Самый важный вопрос. Что на ваш взгляд должна делать эта функция ? заменить в строке под строку. заменить аа на пп кккккккккААкккк -> кккккккккППкккк или в sql запросе будет 6. Вы делали её самостоятельно ? Да. 7. Вызов функции правильный, на ваш взгляд ? Считаю да. Только сейчас заметил ваш ответ. 1. Лишний байт, это не правильно, я например пытался полминуты понять зачем он, пока не понял что он скорее всего не нужен. 3. То, что это затрудняет чтение программы. Что в этом хорошего ? 4. Разбирайтесь, что за ерунда. Должен быть const ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 02:00 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
mayton, кажется я понял про что вы, функция работает правильно, то что её нельзя применять к SQL запросам, другой вопрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 02:03 |
|
||
|
Помогите с функцией.Замена строки в подстроке.
|
|||
|---|---|---|---|
|
#18+
Странно что никто в топике не вспомнил про функцию strstr(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 09:37 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38755455&tid=2019294]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 273ms |
| total: | 415ms |

| 0 / 0 |
