Поиск и замена подстроки с использованием динамической памяти - 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;
}

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

  1. В функции strsets происходит поиск подстроки, которую необходимо заменить, с использованием двух указателей.
  2. Переменная iter инициализируется в качестве указателя на начало строки str.
  3. Переменная sa инициализируется как указатель на первый символ подстроки _ch.
  4. Переменная sb инициализируется как указатель на текущий символ в строке str.
  5. Два вложенных цикла проходят до тех пор, пока не найдено соответствие подстроки _ch в строке str.
  6. Если подстрока не найдена, то старый указатель iter заменяется на новый указатель _new, и символы из _new копируются в str до тех пор, пока не будет найден нулевой символ.
  7. В основной функции main выделяется динамическая память для трех строк: S1, S2 и S3.
  8. Строка S1 инициализируется значением ABCDEF.
  9. Строка S2 инициализируется значением CD.
  10. Строка S3 инициализируется значением KK.
  11. Функция strsets вызывается с аргументами S1, S2 и S3.
  12. Выводится значение переменной S1.
  13. Выделенная память для S1, S2 и S3 освобождается с помощью функции free.
  14. Программа ожидает ввода с клавиатуры символа, чтобы продолжить выполнение.
  15. Функция getchar используется для получения ввода с клавиатуры.
  16. Программа возвращает 0, что означает успешное выполнение.
  17. Программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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