Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция перезаписи подстроки в строке 
:(
    Опции темы
mr.Anderson
Дата 10.12.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



Функция должна перезаписать заданную подстроку на новую, вернуть исправленную строку. Мой код:
Код

char *stringReplace(const char *str, const char *what, const char *to)
{
    char *r = (char *)malloc(sizeof(char));
    char *s = (char *)malloc(sizeof(char) * strlen(str) +1);
    char *pf;
    char *left;
    r[0] = '\0';

    memcpy(s, str, sizeof(char) * strlen(str));
    s[strlen(str)] = '\0';

    while ((pf = strstr(s, what)) != NULL)
    {
     if ((pf-s) > 0)
        {
            left = (char *)malloc(sizeof(char) * (pf-s));
            strncpy(left, s, (pf-s)); //copying left part of S
            left[pf-s] = '\0';
        }

        r[strlen(r) + strlen(left) + strlen(to)] = '\0';
        if ((pf-s) > 0)
        {
            mystrcat(&r, left); //left part of S to R
            free(left);
        }

        mystrcat(&r, to); //new substring to R
        s = pf + strlen(what); //cutting left part of S
    }

    if (strlen(s) != 0)
    {
        mystrcat(&r, s);
    }

    free(s);
    free(pf);

    return r;
}

Работает крайне нестабильно. Причина проста, строка R фиксированного размера не имеет и он изначально неизвестен, приходится задавать динамически. Отсюда глюки, когда выделяем под нее память, то она затирает остальные строки в памяти и начинается ерунда полная.

Первый раз функция отрабатывает корректно (у меня, по крайней мере), так как определение r расположено в начале, она расположена отсюда ниже по памяти и не затирает наших строк, но это неправильно, т.к. мы трем не свою память и фиг ее знает, чего там лежит, а плюс к тому при повторной отработке функции мы снова выделяем память для LEFT, после чего она располагается снова после R, после чего начинается ее затирка... Вот такие веселости... Как исправить эту проблему, помогите, целый день убил и не догадался.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
bsa
Дата 11.12.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



все просто. Используя функцию strstr находишь все вхождения заменяемой подстроки и считаешь их. Затем, с помощью malloc выделяешь память под новую строку, с учетом изменения размера (strlen(src) + (strlen(to) - strlen(what)) * n + 1, где n - количество вхождений), затем в цикле опять с помощью strstr, strcpy и strncat копируешь данные в новый массив.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.