Поиск и замена подстроки с использованием динамической памяти - 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, что означает успешное выполнение.
- Программа завершается.