philosoff's.community.forum

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » philosoff's.community.forum » Учеба и ВМК. » Замена подстроки


Замена подстроки

Сообщений 1 страница 6 из 6

1

(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;            // Во вставленной подстроке поиск проводить не надо

0

2

tmp = tm+l2;            // Во вставленной подстроке поиск проводить не надо

Здесь тоже есть хитрость, надо всё проверять сначала. Пусть есть строка 'asasd', и 'asd' надо заменить на 'dsa':

По твоему алгоритму  'asasd' ->  'asdsa' - есть вхождение 'asd'
Если же каждый раз проверять сначала, то получим:
'asasd' -> 'asdsa' -> 'dsasa'

P.S. Спасибо за ценную информацию об особенностях realloc!

0

3

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?

0

4

По твоему алгоритму 'asasd' -> 'asdsa' - есть вхождение 'asd'
Если же каждый раз проверять сначала, то получим:
'asasd' -> 'asdsa' -> 'dsasa'

Ну да, мой алгоритм работает правильно, а твой глючит. Замени ка g на ggg, у тебя оно повиснет.
А argv у меня - просто массив параметров функции, я по понтовому интерпретатор командной строки реализовал.
argv[1] - pattern
argv[2] - replace

0

5

Ну да, мой алгоритм работает правильно, а твой глючит. Замени ка g на ggg, у тебя оно повиснет.

Да, тогда надо ещё добавлять проверку if(strstr(pattern,replace)!=NULL)...

0

6

Да, тогда надо ещё добавлять проверку if(strstr(pattern,replace)!=NULL)...

Все равно у тебя алгоритм неправильный, сам же написал:

По твоему алгоритму 'asasd' -> 'asdsa' - есть вхождение 'asd'
Если же каждый раз проверять сначала, то получим:
'asasd' -> 'asdsa' -> 'dsasa'

Т.е. вместо замены шаблона ты затронул и те части строки, которые не входили в шаблон.

0


Вы здесь » philosoff's.community.forum » Учеба и ВМК. » Замена подстроки