Функция: замена подстроки в строке на заданную последовательность символов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не успеваю сделать такое задание для шараги, если кто может помочь хотя бы советом или напутствием, как нужно делать или где почитать про это, или каким-то примером кода ,ибо даже не понимаю , что должно из этого получиться. спасибо.

Решение задачи: «Функция: замена подстроки в строке на заданную последовательность символов»

textual
Листинг программы
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
// Функция: замена подстроки в строке на заданную последовательность символов - C (СИ)
char* find_and_insert(char* str,char* sub_str, char* sub_str_rep){
  const int BUFFER_SIZE = 256;
  char* buffer = NULL;
  int buffer_len = 0;
  // если входных данных нет - ничего не делаем.
  if (str && sub_str && sub_str_rep){
    
    // предпологаем что под строку str отведенно достаточно памяти.
    // в противном случае ничего не делаем    
    
    // если длина строки str достаточна для хранения новой строки, продолжаем
    if( strlen(str) < strlen(str) - strlen(sub_str) + strlen(sub_str_rep) ){
      // временный массив
      buffer = (char*)malloc(BUFFER_SIZE);
      // чистим массив от мусора
      memset(buffer, 0, strlen(str));
     
      // Делаем дело. strlen strstr strcat strcpy и strncpy 
      // стандартные ф-ии в string.h
      strncpy(buffer, str, strlen(str) - strlen(strstr(str,sub_str)) );
      strcat(buffer, sub_str_rep);  
      strcat(buffer, strstr(str,sub_str) + strlen(sub_str));
      
      
      //strcat(buffer, str + strlen(str) - strlen(strstr(str,sub_str)) + 1);      
      //strcat(buffer, strstr(str,su))
      strcpy(str, buffer);   
      
      // освобождаем память отведённую под массив
      free(buffer);
    }
  }
  return str;
}
 
 
// пример использования функции
int main(){
  const int MAX_STRING_LENGHT = 256;
  // строка
  char* str = (char*)malloc(MAX_STRING_LENGHT);
  // подстрока которую надо найти
  char* sub = (char*)malloc(MAX_STRING_LENGHT);
  // подстрока на которую надо заменить найденную подстроку
  char* rep = (char*)malloc(MAX_STRING_LENGHT);
  
  // чистим строки
  memset(str, 0, MAX_STRING_LENGHT);
  memset(sub, 0, MAX_STRING_LENGHT);
  memset(rep, 0, MAX_STRING_LENGHT);
  
  // присваиваем строки
  strcpy(str,"hello my world");
  strcpy(sub,"my");
  strcpy(rep,"shit");
  
  // ищем, заменяем и печатаем в консоли
  printf("%s\n", find_and_insert(str, sub, rep) );
  
  // освобождаем память выделенную под строки
  free(rep);
  free(sub);
  free(str);
  
  return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы со строками.
  2. Объявление функции find_and_insert, которая выполняет замену подстроки в строке на заданную последовательность символов.
  3. Установка констант для определения размеров буферов.
  4. Проверка наличия и корректности входных данных.
  5. Проверка достаточности длины строки str для выполнения операции замены.
  6. Выделение памяти под временный массив buffer.
  7. Копирование части строки str в buffer с помощью функции strncpy.
  8. Добавление подстроки sub_str_rep после найденной подстроки sub_str в buffer с помощью функции strcat.
  9. Добавление оставшейся части строки str после замены в buffer с помощью функции strcat.
  10. Копирование измененной строки из buffer в str с помощью функции strcpy.
  11. Освобождение памяти, выделенной под buffer.
  12. Пример использования функции find_and_insert в функции main.
  13. Выделение памяти под строки str, sub и rep.
  14. Очистка строк str, sub и rep с помощью функции memset.
  15. Присваивание значения строкам str, sub и rep с помощью функции strcpy.
  16. Выполнение замены подстроки в строке str на подстроку rep с помощью функции find_and_insert.
  17. Вывод результата замены в консоль с помощью функции printf.
  18. Освобождение памяти, выделенной под rep, sub и str.
  19. Возврат значения 0, указывающего на успешное выполнение программы.
  20. Завершение программы.

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы