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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] не удачно 24.05.01 00:52  Число просмотров: 764
Автор: 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);
}

Все. Удачи
<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