Функция: замена подстроки в строке на заданную последовательность символов - 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;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы со строками.
- Объявление функции
find_and_insert, которая выполняет замену подстроки в строке на заданную последовательность символов. - Установка констант для определения размеров буферов.
- Проверка наличия и корректности входных данных.
- Проверка достаточности длины строки
strдля выполнения операции замены. - Выделение памяти под временный массив
buffer. - Копирование части строки
strвbufferс помощью функцииstrncpy. - Добавление подстроки
sub_str_repпосле найденной подстрокиsub_strвbufferс помощью функцииstrcat. - Добавление оставшейся части строки
strпосле замены вbufferс помощью функцииstrcat. - Копирование измененной строки из
bufferвstrс помощью функцииstrcpy. - Освобождение памяти, выделенной под
buffer. - Пример использования функции
find_and_insertв функцииmain. - Выделение памяти под строки
str,subиrep. - Очистка строк
str,subиrepс помощью функцииmemset. - Присваивание значения строкам
str,subиrepс помощью функцииstrcpy. - Выполнение замены подстроки в строке
strна подстрокуrepс помощью функцииfind_and_insert. - Вывод результата замены в консоль с помощью функции
printf. - Освобождение памяти, выделенной под
rep,subиstr. - Возврат значения 0, указывающего на успешное выполнение программы.
- Завершение программы.