(20:27:42) KiberGus: Насть, а как на уроке написали замену подстроки в 4 строчки? Я похоже это не записал.
(21:01:23) Настенька-Jabber: извини, только увидела...
(21:01:28) Настенька-Jabber: еще актуально?
(21:01:31) KiberGus: Нет.
(21:01:44) KiberGus: За исключением того, что скорее всего у нас там была ошибка
(21:02:04) KiberGus: Не пересчитали адрес найденной строки, а ведь после realloc он изменился
(21:02:58) Настенька-Jabber: а зачем нам пересчитывать адрес найденной строки?
(21:03:11) KiberGus: Мы его ниже realoc используем?
(21:03:57) Настенька-Jabber: нет
(21:04:09) Настенька-Jabber: после realloc мы его уже не используем
(21:04:27) Настенька-Jabber: по крайней мере, я эту функцию уже написала, и вроде она работает
(21:04:44) Настенька-Jabber: там не должно быть ошибки
(21:04:47) KiberGus: Хм, а я использую. Покажи свою пожалуйста
(21:05:51) KiberGus: Можешь просто из исходника скопировать
(21:07:07) Настенька-Jabber: strcpy(t, t+lt);
s = (char *) realloc(s, ls+lp-lt+1);
memmove(t+lp, t, strlen(t)+1);
memcpy(t, p, lp);
(21:07:15) Настенька-Jabber: bc[jlybrb jxtym lfktrj))
(21:07:22) Настенька-Jabber: исходники далеко
(21:07:29) KiberGus: А где strstr?
(21:07:56) Настенька-Jabber: в условии
(21:08:00) Настенька-Jabber: \цикла
(21:08:27) KiberGus: t - адрес найденной подстроки?
(21:08:31) Настенька-Jabber: да
(21:09:02) KiberGus: Введи в свою программу новую подстроку намного более длинуую, чем исходная и оно дапст segfault
(21:09:33) Настенька-Jabber: намного более длинную? это насоклько?
(21:10:40) KiberGus: После realloc у тебя строка может оказаться в новом месте оперативки, если нельзя будет выделить последовательного куска. А указатель на найденную подстроку у тебя останется указывать на старое место. Ну и все, segfault. Только оно может возникать или не возникать даже для одинаковых входных данных.
(21:11:22) KiberGus: Что-то вроде этого должно быть (я еще не отладил):
for (tmp = strings[i]; tm = strstr(tmp, argv[1]){
strcpy (tm, tm+l1); // Удалили подстроку
old = strings[i];
strings[i] = realloc (strings[i], strlen(strings[i]) + l2 + 1);
// Пересчитали адреса
tm = strings[i]+(tm-old);
memove (tm+l2, tm, strlen + 1);
memcpy (tm, argv[2], l2); // Вставили новую подстроку
tmp = tm+l2; // Во вставленной подстроке поиск проводить не надо
Замена подстроки
Сообщений 1 страница 6 из 6
Поделиться12006-10-01 21:15:11
Поделиться22006-10-01 21:47:09
tmp = tm+l2; // Во вставленной подстроке поиск проводить не надо
Здесь тоже есть хитрость, надо всё проверять сначала. Пусть есть строка 'asasd', и 'asd' надо заменить на 'dsa':
По твоему алгоритму 'asasd' -> 'asdsa' - есть вхождение 'asd'
Если же каждый раз проверять сначала, то получим:
'asasd' -> 'asdsa' -> 'dsasa'
P.S. Спасибо за ценную информацию об особенностях realloc!
Поделиться32006-10-01 23:28:31
for (tmp = strings[i]; tm = strstr(tmp, argv[1])
{
...
memcpy (tm, argv[2], l2);
...
}
Я не понял чита с argv. Вот, скажем, у меня есть функция txt_chng(char* strings[], char pattern[], char replace[]), где strings - массив указателей, pattern - заменяемая подстрока, replace - строка, на которую я заменяю pattern. Как мне надо работать с argv?
Поделиться42006-10-02 00:42:41
По твоему алгоритму 'asasd' -> 'asdsa' - есть вхождение 'asd'
Если же каждый раз проверять сначала, то получим:
'asasd' -> 'asdsa' -> 'dsasa'
Ну да, мой алгоритм работает правильно, а твой глючит. Замени ка g на ggg, у тебя оно повиснет.
А argv у меня - просто массив параметров функции, я по понтовому интерпретатор командной строки реализовал.
argv[1] - pattern
argv[2] - replace
Поделиться52006-10-02 21:27:59
Ну да, мой алгоритм работает правильно, а твой глючит. Замени ка g на ggg, у тебя оно повиснет.
Да, тогда надо ещё добавлять проверку if(strstr(pattern,replace)!=NULL)...
Поделиться62006-10-02 22:10:21
Да, тогда надо ещё добавлять проверку if(strstr(pattern,replace)!=NULL)...
Все равно у тебя алгоритм неправильный, сам же написал:
По твоему алгоритму 'asasd' -> 'asdsa' - есть вхождение 'asd'
Если же каждый раз проверять сначала, то получим:
'asasd' -> 'asdsa' -> 'dsasa'
Т.е. вместо замены шаблона ты затронул и те части строки, которые не входили в шаблон.