Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с функцией.Замена строки в подстроке. / 25 сообщений из 35, страница 1 из 2
22.09.2014, 18:50
    #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
22.09.2014, 18:53
    #38753880
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
gera3323,

Очевидный недостаток -- она заменяет key только один раз.
...
Рейтинг: 0 / 0
22.09.2014, 18:56
    #38753883
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
MasterZiv, ок. вложу ее в рекурсивную функцию.
...
Рейтинг: 0 / 0
22.09.2014, 18:56
    #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
22.09.2014, 18:59
    #38753888
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
NekZgera3323,

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


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

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

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

Ну-ну...

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

gera3323, а вы уверены что ваша функция работает ?
...
Рейтинг: 0 / 0
23.09.2014, 02:38
    #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
23.09.2014, 02:39
    #38754123
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
Если честно, то мне не нравится даже её вызов, не говоря про код. Но раз никто другой не прокомментировал, то возможно всё в порядке.
...
Рейтинг: 0 / 0
23.09.2014, 10:14
    #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
23.09.2014, 14:59
    #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
23.09.2014, 15:49
    #38754864
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
Это как будет реализован билдер.
...
Рейтинг: 0 / 0
23.09.2014, 15:52
    #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
23.09.2014, 15:54
    #38754875
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
SashaMercuryЕсли честно, то мне не нравится даже её вызов, не говоря про код. Но раз никто другой не прокомментировал, то возможно всё в порядке.

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

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

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


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


Оракл великолепно справляется с оптимизацией и с бинжёными параметрами.
Этот вопрос лучше обсудить в форуме Oracle. Это касается SQL_ID и управления планами.
...
Рейтинг: 0 / 0
24.09.2014, 04:57
    #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
24.09.2014, 04:59
    #38755441
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с функцией.Замена строки в подстроке.
Прошу прощение, комментарий к функции поиска подстроки неверный "//поиск первой слева подстроки в строке возвращает стартовый индекс подстроки в строке, либо -1."

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


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