Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск и замена подстроки в сроке
 
 автор: MHz   (16.10.2008 в 17:02)   письмо автору
 
 

Доброго времени суток! Передо мной стоит задача, написать функцию замены всех вхождений подстроки в строке. Функция по моей задумке должна иметь три аргумента: искомая строка, заменяемая стока и текст с котором необходимо выполнить данные действие. Вот что у меня пока получаеся:


void StrReplace (char* Search, char* Replace, char* Resource)
{
  char* Pointer = strstr (Resource, Search);

  while (Pointer)
  {
    int SearchLen = strlen (Search);
    int ReplaceLen = strlen (Replace);
    int ResourceLen = strlen (Resource);
    int PointerLen = strlen (Pointer);

    char* NewText = new char [ResourceLen - SearchLen + ReplaceLen + 1];

    strncpy (NewText, Resource, ResourceLen - PointerLen);
    strcpy (NewText, Replace);
    strcpy (NewText, Pointer + SearchLen);
    
    .............
  
    Pointer = strstr (Resource, Search);
  }
}


Так вот как вы видите я не могу записать результат работы функции в исходную строку. Ну не получается у меня чтобы я не пробовал... Помогите! Что делать? Или может быть есть уже подобная стандартная функция?

  Ответить  
 
 автор: MHz   (16.10.2008 в 18:05)   письмо автору
 
   для: MHz   (16.10.2008 в 17:02)
 

В общем не знаю на сколько хорошо у меня получилось решить задачу, но вот что у меня получилось:


char* StrReplace (char* Search, char* Replace, char* Resource)
{
int SearchLen = strlen (Search);
int ReplaceLen = strlen (Search);

char* Pointer = strstr (Resource, Search);

while (Pointer != NULL)
{
int PointerLen = strlen (Pointer);
int ResourceLen = strlen (Resource);

char* NewText = (char*)calloc((ResourceLen - SearchLen + ResourceLen), sizeof(char));

strncpy (NewText, Resource, ResourceLen - PointerLen);
strcat (NewText, Replace);
strcat (NewText, Pointer + SearchLen);

Resource = (char*)realloc(Resource, (ResourceLen - SearchLen + ReplaceLen)*sizeof(char));

for (int i = 0; i < (ResourceLen - SearchLen + ReplaceLen); i++)
{
Resource[i] = NewText[i];
}

free (NewText);

Pointer = strstr (Resource, Search);
}

return Resource;
}


Вроде бы работает =) Но может быть будут какие нибудь замечания?

  Ответить  
 
 автор: MHz   (16.10.2008 в 21:24)   письмо автору
 
   для: MHz   (16.10.2008 в 18:05)
 

Вот еще подумал было бы не плохо перед поиском проверить не равны ли строки Search и Replace и если равны не пускать цикл, иначе получается безконечный цикл...

  Ответить  
 
 автор: MHz   (16.10.2008 в 21:25)   письмо автору
 
   для: MHz   (16.10.2008 в 21:24)
 

Все! Вроде бы все идеально! =) Спасибо за помощь!

  Ответить  
 
 автор: анон   (27.01.2011 в 18:31)
 
   для: MHz   (16.10.2008 в 21:25)
 

char* NewText = (char*)calloc((ResourceLen - SearchLen + ResourceLen), sizeof(char));

вроди надо заменить на char* NewText = (char*)calloc((ResourceLen - SearchLen + ReplaceLen), sizeof(char));

  Ответить  
 
 автор: анон   (27.01.2011 в 18:34)
 
   для: анон   (27.01.2011 в 18:31)
 

да и
int ReplaceLen = strlen (Search);
на
int ReplaceLen = strlen (Replace);

  Ответить  
 
 автор: анон   (27.01.2011 в 18:48)
 
   для: анон   (27.01.2011 в 18:34)
 

окончательный вариант

char* str_replace(char* search, char* replace, char* resource)
{
size_t search_len = strlen(search);
size_t replace_len = strlen(replace);

char* pointer = strstr(resource, search);

while (pointer != NULL)
{
size_t i;
size_t pointer_len = strlen(pointer);
size_t resource_len = strlen(resource);

char* new_text = (char*)calloc((resource_len - search_len + replace_len), sizeof(char));

strncpy(new_text, resource, resource_len - pointer_len);
strcat(new_text, replace);
strcat(new_text, pointer + search_len);

free(resource);
resource = new_text;

pointer = strstr(resource, search);
}

return resource;
}

  Ответить  
 
 автор: zerstroer   (03.03.2011 в 11:56)   письмо автору
 
   для: анон   (27.01.2011 в 18:48)
 

При зацикловке работает некорректно!
+
отсутсвует проверка на вхождение заменяемой подстроки в заменяющую.

  Ответить  
 
 автор: Nokse   (08.11.2011 в 01:46)
 
   для: анон   (27.01.2011 в 18:31)
 

С учетом этих поправок работать не хотело. натыкалось на строчку
Resource = (char*)realloc(Resource, (ResourceLen - SearchLen + ReplaceLen)*sizeof(char));
и выдавало ошибку доступа к памяти (ацес виолейшн, пардон за мой французский)). После того, как закоментировал эту строку - работает чудесно. По крайней мере, прекрасно заменило прямые слеши на обратные в строке, содержащей адрес папки.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования