информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] а я сделал так: 23.05.01 23:37  Число просмотров: 759
Автор: myrmidon Статус: Незарегистрированный пользователь
Отредактировано 23.05.01 23:38  Количество правок: 1
<"чистая" ссылка>
char code[0x5000], code2[0x5000], sz3[0x3000];

/*В переменной code содержится весь текст*/

char *sz = new char[0x3000];

UINT j = 0;

if(strstr(code, "&"))
{
strcpy(code2, "");
while(strstr(code, "&"))
{
j = (UINT)strstr(code, "&") - (UINT)code;
strncpy(sz3, code, j);
sz3[j] = 0;
strcat(code2, &sz3[0]);
strcat(code2, "amp");
sz = strchr(code, '&')?strchr(code, '&') + 1:code;
strcpy(code, sz);
}
strcat(code2, code);
}

в переменной code2 обработанный текст
Можт я всё это не правильно сделал, но главное что этот код работает!
<programming>
[C++] как заменить символ на слово 14.05.01 12:50  
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
субж, если есть текст как char[0x100], желательно все одинаковые на слово, например, все знаки & заменить на слово "amp"
Желательно с помощью функций семейства str...
[C++] как заменить символ на слово 23.05.01 12:52  
Автор: PS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> субж, если есть текст как char[0x100], желательно все
> одинаковые на слово, например, все знаки & заменить на
> слово "amp"
> Желательно с помощью функций семейства str...

1. Во первых, как ты понимаешь, в ограниченом буфере ты это не сделаешь. Придется пользоватся например realloc.
2. Во вторых - это не perl - одной, двумя функциями не обойдешся. Алгоритм примерно такой:
а. Ищеш начало искомого слова.
б. Копируешь все что до него в "резиновый" буфер.
в. Копируешь в "резиновый" буфер замену.
г. От конца искомого слова ищеш следующее. (б. или д.)
д. Копируешь остаток в "резиновый".

Проще не выйдет.
[C++] как заменить символ на слово 23.05.01 19:53  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Алгоритм хороший, но по моему возня с "резиновым" буфером не очень хорошая идея, если конечно речь не идет об жесткой экономии памяти.
я бы сделал так, если все знаки & заменить на слово "amp" :
если
char *src =(char*)malloc(0x100);
то
char* dst = (char*)malloc(0x100 * 3);
тут замена '&' на "amp"
.........
дальше
dts = (char*)realloc(dst, strlen(dst) + 1);

и буфер растягивать не надо по нескольку раз.

короче так (для строки - строкой, а для 1 символа еще проще):

char* replace(const char* src, const char* replStr, const char* replWith)
{
int lenSrc = (int)strlen(src);
int lenStr = (int)strlen(replStr);
int lenWith= (int)strlen(replWith);
int lenDst = (lenSrc / lenStr) * lenWith +lenSrc - (lenSrc / lenStrt) * lenStrt; // максимум возможный
char *dst = (char*)malloc(lenDst + 1);
const char *start = src;
char *temp = dst;
char *end;

while ((end = strstr(start, replStr)) != NULL)
{
memcpy(temp, start, end - start);
temp += end - start;
strcpy(temp, replWith);
temp += (int)lenWith;
start = end + (int)lenSrt;
}
strcpy(temp, start);
dst = (char*)realloc(dst, strlen(dst) + 1);
return dst;
}
[C++] а я сделал так: 23.05.01 23:37  
Автор: myrmidon Статус: Незарегистрированный пользователь
Отредактировано 23.05.01 23:38  Количество правок: 1
<"чистая" ссылка>
char code[0x5000], code2[0x5000], sz3[0x3000];

/*В переменной code содержится весь текст*/

char *sz = new char[0x3000];

UINT j = 0;

if(strstr(code, "&"))
{
strcpy(code2, "");
while(strstr(code, "&"))
{
j = (UINT)strstr(code, "&") - (UINT)code;
strncpy(sz3, code, j);
sz3[j] = 0;
strcat(code2, &sz3[0]);
strcat(code2, "amp");
sz = strchr(code, '&')?strchr(code, '&') + 1:code;
strcpy(code, sz);
}
strcat(code2, code);
}

в переменной code2 обработанный текст
Можт я всё это не правильно сделал, но главное что этот код работает!
[C++] не удачно 24.05.01 00:52  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Во-первых у тебя остается Memory Leak - это сразу видно, следи за комментариями обозначенным ^^^^^^^

> char code[0x5000], code2[0x5000], sz3[0x3000];
>
> /*В переменной code содержится весь текст*/
>
> char *sz = new char[0x3000];
^^^^^^^^^^^^^^^^^^^ тут ты зарезервироал место и не высвободил, да и судя по коду, это тебе не к чему, можно было просто объявить char* sz;
>
> UINT j = 0;
>
> if(strstr(code, "&"))
> {
> strcpy(code2, "");
> while(strstr(code, "&"))
> {
> j = (UINT)strstr(code, "&") - (UINT)code;
> strncpy(sz3, code, j);
> sz3[j] = 0;
> strcat(code2, &sz3[0]);
> strcat(code2, "amp");
> sz = strchr(code, '&')?strchr(code, '&') + 1:code;
^^^^^^^^^^^^^^^ вот тут ты меняешь адрес sz и теряешь возможность освободить память, поэтому строка char* sz = new char[0x3000]; не кчему.
> strcpy(code, sz);
> }
> strcat(code2, code);
> }
>
> в переменной code2 обработанный текст
> Можт я всё это не правильно сделал, но главное что этот код
> работает!

Работать она вроде работает, хотя не пойму почему :-)))) шучу
Но ты видешь сколько у тебя лишних действий? в моем примере все делается "легким движением руки" и никакого мусора не остается в памяти.
и еще, для перестановки у тебя не хватит места, например весь текст у тебя полностью от и до "залит" символами '&', тогда как поступишь? Отсюда все сводится т "резиновому" буферу. Следует учитывать все случаи.
для солидного(коммерческого) кода тебе следует пересмотреть код, и к тому же у тебя данные собираются в переменную code2, а если у тебя в тексте вообще не будет символа '&', то code2 не понятно что будет в себе содержать. Хотя бы дописал так

if(strstr(code, "&"))
{
..............
}
else
{
strcpy(code2, code);
}

Все. Удачи
[C++] не удачно 24.05.01 13:46  
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Ну на счот всего этого ты прав, но просто я кинул не рил кусок кода, а просто набросал, конешно в проге я удалю потом то что создал с помощью new, а вообще, символов & не очень много! это 100%!
Спасибо за твой код, по пробую его поюзать! если ты не против!
[C++] не удачно 24.05.01 18:40  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Ну на счот всего этого ты прав, но просто я кинул не рил
> кусок кода, а просто набросал, конешно в проге я удалю
> потом то что создал с помощью new, а вообще, символов & не
> очень много! это 100%!

Суть не в 100%, а в универсальности, на все случаи. Есть такое понятие - Code Reuse - вторичное использование (ну ладно, это не важно).

> Спасибо за твой код, по пробую его поюзать! если ты не
> против!
Пожалуйста конечно, но зачем обижать? :)))
пользуйся на здоровье, иначе не написал бы.
[C++] как заменить символ на слово 14.05.01 13:32  
Автор: Raven Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> субж, если есть текст как char[0x100], желательно все
> одинаковые на слово, например, все знаки & заменить на
> слово "amp"
> Желательно с помощью функций семейства str...

С помощью одной ф-ии этого не сделать. Пользуйся ф-ми strchr, strcpy, srtcat
[C++] [C++] как заменить символ на слово 14.05.01 14:31  
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
ну а по конкретнее???
Приблизительно... 24.05.01 16:27  
Автор: False_Delirium Статус: Незарегистрированный пользователь
<"чистая" ссылка>
char st, *ch, ;
...
gets(st) ;
ch = st ;
while(ch = strpos("a"))
{
*ch="AAA" ;
ch++ ;
}
...

протестировать негде ... и я не программирую на С, так что сами доведите до ума.. ноэтот вопрос решается именно так просто.....но давно практики не было...
[C++] Ты меня извини, но такого бреда я давно не видел... 24.05.01 19:08  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Не хотел я отвечать, тем более тема пустая, но не удержался :(
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach