Поиск и замена подстроки с использованием динамической памяти - C (СИ)
Формулировка задачи:
Доброго времени суток. Необходимо реализовать программу на С, которая ищет и заменяет подстроку аналогично Паскалю.
Пример: S1 "abcdef" S2 "cd" S3 "kk" В строке S1 cd должен замениться на kk. При этом необходимо использовать динамическую память. Вот начало моего кода, который выделяет память под строки.
Помогите пожалуйста!
#include <stdio.h> #include <string.h> int main () { char* source=malloc(10);// Выделение 10 байт в массив S int i=0; source[i]=getchar();// Считываем первый символ с клавиатуры while (source[i]!=13) {i++; source[i]=getchar();// Поэлементный ввод if (i%10==9) source=realloc (source,i+10);} char* oldsubstr=malloc(10);// Выделение 10 байт в массив S int i1=0; oldsubstr[i]=getchar();// Считываем первый символ с клавиатуры while (oldsubstr[i]!=13) {i++; oldsubstr[i]=getchar();// Поэлементный ввод if (i%10==9) oldsubstr=realloc (oldsubstr,i+10);} char* newsubstr=malloc(10);// Выделение 10 байт в массив S int i2=0; newsubstr[i]=getchar();// Считываем первый символ с клавиатуры while (newsubstr[i]!=13) {i++; newsubstr[i]=getchar();// Поэлементный ввод if (i%10==9) newsubstr=realloc (newsubstr,i+10);} }
Решение задачи: «Поиск и замена подстроки с использованием динамической памяти»
textual
Листинг программы
#include <stdio.h> #include <string.h> void strsets(char* str, char* _ch, char* _new) { char* iter, *sa, *sb; for(iter = str; *iter; *iter++) { for(sb = iter, sa = _ch; *sa == *sb && *sb; *sa++, *sb++); if(! *sa) for(sa = _new; *sa; *iter++ = *sa++); } } int main(int argc, char* argv[]){ char* S1 = (char*) malloc(7); char* S2 = (char*) malloc(3); char* S3 = (char*) malloc(3); // scanf("%s", S1); strcpy(S1, "ABCDEF"); // scanf("%s", S2); strcpy(S2, "CD"); // scanf("%s", S3); strcpy(S3, "KK"); strsets(S1, S2, S3); puts(S1); free(S1); free(S2); free(S3); getchar(); return 0; }
Объяснение кода листинга программы
- В функции
strsets
происходит поиск подстроки, которую необходимо заменить, с использованием двух указателей. - Переменная
iter
инициализируется в качестве указателя на начало строкиstr
. - Переменная
sa
инициализируется как указатель на первый символ подстроки_ch
. - Переменная
sb
инициализируется как указатель на текущий символ в строкеstr
. - Два вложенных цикла проходят до тех пор, пока не найдено соответствие подстроки
_ch
в строкеstr
. - Если подстрока не найдена, то старый указатель
iter
заменяется на новый указатель_new
, и символы из_new
копируются вstr
до тех пор, пока не будет найден нулевой символ. - В основной функции
main
выделяется динамическая память для трех строк:S1
,S2
иS3
. - Строка
S1
инициализируется значениемABCDEF
. - Строка
S2
инициализируется значениемCD
. - Строка
S3
инициализируется значениемKK
. - Функция
strsets
вызывается с аргументамиS1
,S2
иS3
. - Выводится значение переменной
S1
. - Выделенная память для
S1
,S2
иS3
освобождается с помощью функцииfree
. - Программа ожидает ввода с клавиатуры символа, чтобы продолжить выполнение.
- Функция
getchar
используется для получения ввода с клавиатуры. - Программа возвращает 0, что означает успешное выполнение.
- Программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д