powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как грамотно оформить замены символов в char[]
8 сообщений из 8, страница 1 из 1
Как грамотно оформить замены символов в char[]
    #34069770
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, дорогие коллеги.

Есть буфер борюсь с функцией замены в строке char. Пишу сам, аналогов не знаю, алгоритмов не нашел, если есть у кого то полезные линки, буду очень признателен.

И так,
Код: 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.
void main()
{
	char *buff = new char[ 1024 ];
	strcpy(buff,"0123eHell sdfjkahskgna;rn;sjsdjk%fds$%%SFS%AS%%ASafsf$%World%fdd&%world% World");
	buff = replace(buff,"%World%","%%%Hi%%%");
	buff = replace(buff,"0123","1234567890");
}
............................
int find(const char* buff, const char* what)
{
	int j =  0 ;
	int i =  0 ;
	int len = strlen(buff);
	while (i < len)
	{
		if( buff[i] == what[j] )
		{	
			j++;
		
			if(j == strlen(what))
				return i-j+ 1 ;
		}
		else
			if(j)
			{
				i--;
				j= 0 ;
			}

		i++;
	}
	return - 1 ;
}

char* replace(char* buff, const char* from, const char* to)
{
	int iHead =  0 ;
	int jTail =  0 ;
	
	int Head_Len =  0 ;
	int Tail_Len =  0 ;
	int Len =  0 ;
	
	char *Head = NULL;
	char *Tail = NULL;

	if ((iHead = find(buff, from)) >=  0 )
	{
		jTail = iHead + strlen(from);
		
		//Выделяем хвост
		Tail_Len = strlen(&buff[jTail]);
		Tail = new char[Tail_Len+ 1 ];
		strcpy(Tail,&buff[jTail]);
		buff[iHead] = '\0';
		
		//выделяем голову
		Head_Len = strlen(buff);
		Head = new char[Head_Len+ 1 ];
		strcpy(Head,buff);
		
		//удаляем буфер
		delete [] buff;
		
		Len = Head_Len + strlen(to) + Tail_Len;
		buff = new char[Len];
		strcpy(buff,Head);
		strcat(buff,to);
		strcat(buff,Tail);

		delete Head;
		delete Tail;
	}	
	return buff;
}

Разумееться есть ошибки, проявляються во время работы второго replace. Правильно ли я делаю:
Если в кратце, то функция replace занимается тем что принимает указатель на буфер строки, после чего она разбивает ее на две части, для обоих выделяет память, в первую часть заносит все что до "искомой" подстроки, а во вторую то что после нее. Далее создает новый буфер, большей длины, и копирует туда сначала начало (Head), потом подсроку, на которую мы заменяем искомую, а после и хвост(Tail). И возвращает указатель на новую строку вызывающей функции main();

Явно, что с этит дополнительными буферами я что то намудрил, знающие люди подскажите правильный путь.
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34069801
itsme8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В наше время работать с функциями из string.h - это экстрим. Чем плоха библиотека STL и класс string?
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34069856
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не умею STL =)
Проблема кстати решилась, добавил байт при выделении ного буфера под конец строки, и все свершилось вроде как.

Критика разумееться уместа.

И примеры из STL тоже. =)
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34069952
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFFКритика разумееться уместа.

1. find лучше бы возвращала NULL при ошибке, и в, функции ее вызывающей, делать проверку на NULL.
2. вообще, вместо find можно использовать strstr
3. Зачем выделять 2 буфера с начала, если уже все данные для длины результирующей строки известны?
4. Удаление и создание буферов желательно делать в одной функции. С точки зрения правельной структуры.
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34070007
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если find возврашает NULL, то толковаться это может как 0, у меня она возвращает индекс первого элекмента найденного слова.
На счет выделения в одной функции, не понимаю как это можно сделать... Да и какой смысл?
На счет strstr надо покумекать, никогда ее не юзал.
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34070125
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFFЕсли find возврашает NULL, то толковаться это может как 0, у меня она возвращает индекс первого элекмента найденного слова.
На счет выделения в одной функции, не понимаю как это можно сделать... Да и какой смысл?
На счет strstr надо покумекать, никогда ее не юзал.

А ну да. Не обратил внимания. Думал, что у тебя указатель возвращается.

Как сделать? Выделил память, отдал в replace, не нужна потом удалил. А для результата в replace тоже передал блок памяти. А смысел в том, что у тебя не грамотная структура, будешь все время заморачиваться, что где выделилось, что где удалилось.
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34070210
Stin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор DжеFF И примеры из STL тоже. =)

Попробую скромно внести свои 5 копеек. Вот так пойдет? :)

Код: plaintext
1.
2.
3.
4.
5.
6.
	
string s = "0123eHell sdfjkahskgna;rn;sjsdjk%fds$%%SFS%AS%%ASafsf$%World%fdd&%world% World";
    string chego = "world";
    string na_chto = "Hi";
    string::size_type idx = s.find(chego);
    if (idx != string::npos)
        s.replace(idx,chego.length(),na_chto);
...
Рейтинг: 0 / 0
Как грамотно оформить замены символов в char[]
    #34072243
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
void Replace(char *szBuf, const char *szWhat, const char *szTo)
{
	size_t len = strlen(szBuf);
	size_t wlen = strlen(szWhat);
	size_t tlen = strlen(szTo);
	int    delta = wlen-tlen;
	char *end = szBuf+len;
	char *pos;
	
	while( (pos = strstr(szBuf,szWhat)) != NULL){
		if ( delta >  0  ) 
			memmove(pos,pos+delta,len+ 1 -(pos-szBuf));
		else if (delta <  0 )
			memmove(pos-delta,pos,len+ 1 -(pos-szBuf));
		memcpy(pos,szTo,tlen);
	}
}
Это справедливо, если szBuf не может быть переполнен тогда, когда delta < 0
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как грамотно оформить замены символов в char[]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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