Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
[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
|
Не хотел я отвечать, тем более тема пустая, но не удержался :(
|
|
|