powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с функцией.Замена строки в подстроке.
10 сообщений из 35, страница 2 из 2
Помогите с функцией.Замена строки в подстроке.
    #38755455
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более интересен случай с заменой всех таких подстрок в одной строке. Данная задача интересна как с точки зрения вариаций постановки, так и с точки зрения реализации. С большой долей вероятности всё это уже реализовано, но более интересно решить эту задачу самому(к сожалению мне сейчас нужно готовиться к отлету послезавтра, потому просто нет времени((). Но тем не менее я напишу свои мысли по поводу постановки и возможных вариантов решения этой задачи.

1.Нам дана строка и подстрока, нужно заменить все подстроки в исходной строке один раз. В лоб данная постановка решается решается следующим образом: идём по строке, встретили подстроку, операции аллоцирования, вставка новой подстроки, идём дальше..
Однако выше я встретил справедливое замечание по поводу того что слишком часто перевыделять память не стоит, по причине ресурсоёмкости данной операции. Таким образом, хорошо было бы сразу узнать сколько нам нужно выделить памяти. А уже потом проводить замены. Как это можно узнать ? Нужно пройтись по массиву символов, и узнать сколько потребуется замен. А далее что ? Проходить второй раз, снова искать индексы начала подстрок для замены ? Мне такой вариант не кажется самым хорошим. Потому можно было в первом проходе сохранить в массиве индексы начала подстрок для замены. Но мы не знаем сколько таких элементов будет в массиве, потому снова мы приходим к многократным операция аллоцирования(я беру общий случай, потому количество этих операций может быть например 10!, если нас массив соответствующего размера). Это тоже не очень хорошо. Потому можно выделить сразу например 10^5 байт под этот массив, и если не будет хватать, то увеличивать его в двое по мере необходимости. Вот такой вариант стоит отметить. Хотя тут у нас появляется побочная сложность, а это нам не очень нужно.

Есть другой вариант, пусть мощность (количество элементов в массиве символом), равна например p. Можно создать битовый массив(а это можно сделать ?) мощностью p, и во время поиска подстрок в строке записывать в соответствующий бит значений 1, например, которое будет нам показывать что тут нужна замена. Но опять таки, при больших объёмах памяти, у нас появляются новые траты памяти. И если мы можем создать битовый массив, то мы затратим p+p/8 вместо p байт(это ещё терпимо), а если битовый массив создать нельзя, то мы тратим памяти в два раза больше.

2. Нам дана строка и подстрока, нужно заменить все подстроки циклически. Тут снова идёт разброс по вариантам постановки и реализации, потому писать пока не буду. Нужно подробно описывать нюансы, например такой:
у нас есть строка abcabcabc, нужно заменить подстрок abcabc на 123, что в какой порядке менять ?

PS
битовый массив создать можно, по крайней мере мы можем его имитировать. если не ошибаюсь
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755941
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, ты протестировал тот кейс с заменой строки внутри литерала
который я приводил выше?
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38756015
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДанная задача интересна как с точки зрения вариаций постановки, так и с точки зрения реализации.
Нет. Неинтересна. Книжники и Фарисеи давно уже прописали это в свои пергаменты.
Читай в поисковике по следующим ключевым словам.

Алгоритм Кнута — Морриса — Пратта

Бойера — Мура

Ахо — Корасик
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38756303
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не проверял. завтра проверю, не очень понял где должны быть проблемы
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38756329
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, смотри внимательно мой пост 16608361
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38756900
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо плохо прочитал, но в чём может быть проблема не понял (
Вот что я сделал(хотя мне не нравится как тут вызывается функция)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char *text = "SELECT usrpas,usrlog||':PK' FROM list.authdata WHERE usrpas = :SEEEE AND usrlog = :PK";
	printf("%s %i\n", text, strlen(text));
	text = replace_substring(text, ":IEEEEEEEEEED", "222");
	printf("%s %i\n", text, strlen(text));
	text = replace_substring(text, ":PK", "333333");
	printf("%s %i\n", text, strlen(text));
	return 0;



результат прикрепил
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38756902
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38756903
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, кажется я понял про что вы, функция работает правильно, то что её нельзя применять к SQL запросам, другой вопрос
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38757016
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно что никто в топике не вспомнил про функцию strstr().
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38757060
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Я вспомнил, но подумал, что автор хочет потренироваться и сделать всё сам.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с функцией.Замена строки в подстроке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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