powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с функцией.Замена строки в подстроке.
35 сообщений из 35, показаны все 2 страниц
Помогите с функцией.Замена строки в подстроке.
    #38753877
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
char *str_replace( char *str, char *key, char *value )
{
    int len_str = strlen( str ) + 1 - strlen( key ) + strlen( value ) + 1;
 
    char *buf = NULL;
 
    buf = (char*)realloc( buf, len_str );
 
    register char *q  =  str,   *k  =  key, 
                  *v  =  value, *b  =  buf;
 
    while( *b++ = *q++ ) {
       if( *q != *k ) {
            continue;
       }
       for( ;; ) {
         if( *k == 0 ) {
            while(*b = *v++ ) {
                *b++; 
            }
            break;
         };
 
         if(*q++ != *k++) { 
             q -= 2;
             break;
         }
       };
 
       k = key;
    };
 
    *b = '\0';
 
    return buf;
};
 
 
void main()
{
    char *text = "SELECT * FROM list.authdata WHERE usrpas = :SEEEE AND usrlog = :PK";
 
    text = str_replace( text, ":IEEEEEEEEEED", "222" );
    text = str_replace( text, ":PK", "333333" );
 
    cout<<text<<endl;
}



1. При каких условиях функция может дать не правильный результат ?
2. Можно ли сделать функцию более быстрее ?
функция будет использоватся в подстановке параметров в скл запросе.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753880
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323,

Очевидный недостаток -- она заменяет key только один раз.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753883
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, ок. вложу ее в рекурсивную функцию.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753885
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323,

Есть более простая реализация.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
std::string replaceString( std::string subject, std::string const & search, std::string const & replace ) {
   size_t pos = 0;
   while ( ( pos = subject.find( search, pos ) ) != std::string::npos ) {
       subject.replace( pos, search.length(), replace );
       pos += replace.length();
   }
   return subject;
}
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753888
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZgera3323,

Есть более простая реализация.


и чем же она лучше ? тем что она стала на пару строк короче....
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753899
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323,

Выбор за Вами. Учитывая, что в С++, принято использовать std::string, вместо char * для различных строковых операций, дабы не портить себе настроение при написании кода ;-)
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753916
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323MasterZiv, ок. вложу ее в рекурсивную функцию.

Ага, и рекурсивно будешь память выделять ?

Ну-ну...

Выделение памяти -- достаточно дорогая операция.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38753936
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivнет. память будет выделена раньше. к примеру в main
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754120
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял, что вы считаете что она работает, раз спрашиваете gera33231. При каких условиях функция может дать не правильный результат ?

gera3323, а вы уверены что ваша функция работает ?
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754122
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Код: plaintext
1.
int len_str = strlen( str ) + 1 - strlen( key ) + strlen( value ) + 1;



Зачем вы просите памяти на 1 больше чем нужно ?

2.
Код: plaintext
1.
2.
3.
 char *buf = NULL;
 
    buf = (char*)realloc( buf, len_str );



почему не выделяете память в одну строку через malloc ?

3. Зачем вы ставите ; после окончания блоков операторов ?

4. Покажите квалификаторами ваше отношение к входным параметрам. Какие из них меняются функцией, а какие нет.

5. Самый важный вопрос. Что на ваш взгляд должна делать эта функция ?

6. Вы делали её самостоятельно ?

7. Вызов функции правильный, на ваш взгляд ?
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754123
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если честно, то мне не нравится даже её вызов, не говоря про код. Но раз никто другой не прокомментировал, то возможно всё в порядке.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754270
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
String replacement в общем случае нельзя применять к SQL запросам. Key выражение
может внезапно оказаться в строковом литерале и тогда результат - непредсказуем.
Код: plaintext
1.
2.
3.
4.
char *text = "SELECT usrpas,usrlog||':PK' FROM list.authdata WHERE usrpas = :SEEEE AND usrlog = :PK";
 
    text = str_replace( text, ":IEEEEEEEEEED", "222" );
    text = str_replace( text, ":PK", "333333" );



Нужно не реплейсить запрос а пользоваться специальными Builder-ами запросов.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754750
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonString replacement в общем случае нельзя применять к SQL запросам. Key выражение
может внезапно оказаться в строковом литерале и тогда результат - непредсказуем.
Код: plaintext
1.
2.
3.
4.
char *text = "SELECT usrpas,usrlog||':PK' FROM list.authdata WHERE usrpas = :SEEEE AND usrlog = :PK";
 
    text = str_replace( text, ":IEEEEEEEEEED", "222" );
    text = str_replace( text, ":PK", "333333" );



Нужно не реплейсить запрос а пользоваться специальными Builder-ами запросов.

... которые сделают то же самое за тебя...

(но возможно правильно, с экранированием)
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754864
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это как будет реализован билдер.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754870
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗачем вы просите памяти на 1 больше чем нужно ?
Раньше функция по другому немного была устроена. если не указать один символ, то она зависает. просто не убрал это.

2.

сама функция расположена в классе и буфер там. Я и этот код просто скопировал и вставил сюда.

char *buf = NULL;

buf = (char*)realloc( buf, len_str );

почему не выделяете память в одну строку через malloc ?
память выделяется в конструкторе. а перераспределяется( в случаи если ее мало) в другой функции перед вызовом str_replace и другими.

3. Зачем вы ставите ; после окончания блоков операторов ?
такой стиль. что в этом плохого ?

4. Покажите квалификаторами ваше отношение к входным параметрам. Какие из них меняются функцией, а какие нет.
const дает ошибку. _in_ что ли ?

5. Самый важный вопрос. Что на ваш взгляд должна делать эта функция ?

заменить в строке под строку. заменить аа на пп кккккккккААкккк -> кккккккккППкккк или в sql запросе будет

6. Вы делали её самостоятельно ?
Да.

7. Вызов функции правильный, на ваш взгляд ?
Считаю да.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38754875
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли честно, то мне не нравится даже её вызов, не говоря про код. Но раз никто другой не прокомментировал, то возможно всё в порядке.

ну сделайте правильно. раз вы такой гений.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755189
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323функция будет использоватся в подстановке параметров в скл запросе.
Неужели ещё существуют СУБД, не поддерживающие параметризованные запросы?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755197
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovgera3323функция будет использоватся в подстановке параметров в скл запросе.
Неужели ещё существуют СУБД, не поддерживающие параметризованные запросы?..

Для аналитических запросов Oracle обычно хардкодят константы. Это имеет
своё обоснование для тех кто ценит время работы процесса аналитики.

Плюс для некоторых особо извращённых GUI-интерфейсов профиль выражения
WHERE может быть неопределеён или содержать OVER 9000 параметров большая
часть которых не используется но может быть активирована пользователем.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755236
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня всегда удивляло: почему создать несколько тысяч (java) классов - нормально, а структурировать несколько сотен (SQL) запросов - нечто запредельное?
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755239
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О структуризации можно говорить только в рамках конкретной бизнес-задачи.
В общем случае SQL не структурируется.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755253
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonО структуризации можно говорить только в рамках конкретной бизнес-задачи.
В общем случае SQL не структурируется.Но, обычно, и нет задачи написания "универсального решателя проблем", а структурирование конкретных запросов может указать пути более эффективной организации кода.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755325
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДля аналитических запросов Oracle обычно хардкодят константы. Это имеет
своё обоснование для тех кто ценит время работы процесса аналитики.


Оракл великолепно справляется с оптимизацией и с бинжёными параметрами.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755393
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonДля аналитических запросов Oracle обычно хардкодят константы. Это имеет
своё обоснование для тех кто ценит время работы процесса аналитики.


Оракл великолепно справляется с оптимизацией и с бинжёными параметрами.
Этот вопрос лучше обсудить в форуме Oracle. Это касается SQL_ID и управления планами.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755438
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323, то что вам нужно, я бы реализовал следующим образом (данная реализация представлена в первом приближении).
Основная функция возвращает новую строку с 1 заменённой подстрокой.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//функция возвращает равны ли подстроки. принимает указатель на начало строки1 и строки2, и длину обоих строк
//реализована таким образом из-за того, что на входе именно подстроки, те терминальный нуль может отсутствовать
bool isEqual_substrings(const char* s1, const char* s2, int p)
{
	int i = 0;
	while (*(s1 + i) == *(s2 + i) && i < p)
	{
		++i;
	}
	return i == p;
}

//поиск первой слева подстроки в строке возвращает стартовый индекс подстроки в строке, либо -1. 
//предполагается что длина строки p1>=p2 длины подстроки.
//функция принимает указатель на начало строки и подстроки, длину строки p1,подстроки p2
char* search_substring(const char* s, const char* subs, int p1, int p2)
{
	for (int i = 0; i < p1 - p2 + 1; ++i)
	{
		if (isEqual_substrings(s + i, subs, p2))
		{
			return (char*)(s + i);//можно вернуть это значение без приведения типа ?
		}
	}
	return NULL;//если подстрока не найдена
}

char* replace_substring(const char* s, const char* subs, const char* newsubs)
{
	int p = strlen(s);
	int p1 = strlen(subs);
	int p2 = strlen(newsubs);
	
	//если длина искомой строки больше длины основной строки
	if (p1 > p)
	{
		return (char*)s;
	}

	char* repl_in = search_substring(s, subs, p, p1);
	if (repl_in)//если подстрока найдена
	{
		int res_p = p - p1 + p2 + 1;
		char* res = (char*)malloc(res_p*sizeof(char));
		//копирование из строки до индекса подстроки
		int i = 0;
		while (s + i != repl_in)
		{
			*(res + i) = *(s + i);
			++i;
		}
		//копирование новой строки
		for (int k = 0; k < p2; ++k, ++i)
			*(res + i) = *(newsubs + k);
		//копирование из строки после пропуска подстроки
		for (int k = 0; *(repl_in + p1 + k); ++k, ++i)
			*(res + i) = *(repl_in + p1 + k);
		
		*(res + i) = '\0';
		return res;
	}
	
	//если подстрока не найдена, возвращаем исходную строку
	return (char*)s;
}

int main(int argc, char** argv)
{
	char* s = "Hello sql.ru ....   math books football see you later alligator for a while crocodile sdfsdhfsdjkfh end";
	printf("%s %i\n", s,strlen(s));
	char* res=replace_substring(s, "crocodile", "123456789");
	printf("%s %i\n", res, strlen(res));
}
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #38755441
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, комментарий к функции поиска подстроки неверный "//поиск первой слева подстроки в строке возвращает стартовый индекс подстроки в строке, либо -1."

возвращает указатель.
...
Рейтинг: 0 / 0
Помогите с функцией.Замена строки в подстроке.
    #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
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с функцией.Замена строки в подстроке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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