Перед каждым вхождением символа C в строку S вставить строку S0 - C (СИ)

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

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

Гайз, прошу вашей помощи. Пытаюсь решить следующую задачу: "Дан символ C и строки S, S0. Перед каждым вхождением символа C в строку S вставить строку S0." Знаю, что ее можно и наверное будет проще решить использую различные функции библиотеки string.h, но хочу решить ее методом, продемонстрированным ниже, если это возможно. Помощь нужна в поиске ошибки, т.к. программа работает неисправно. Код программы:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <string.h>
  5. int main()
  6. {
  7. setlocale (2, "RUSSIAN");
  8. int i, j, k;
  9. char *S, S0[256], C;
  10. S=(char *)malloc(256*sizeof(char));
  11. printf("Программа вставляет строку S0 перед каждым вхождением символа C в строку S.\n\n");
  12. printf("Введите строку S: ");
  13. gets(S);
  14. printf("Введите строку S_0: ");
  15. gets(S0);
  16. printf("Введите символ С: ");
  17. C=getchar();
  18. for (i=0; i<strlen(S); i++) /// Бегу по всем элементам строки S слева направо
  19. if (*(S+i)==C) { /// Если нашел в строке элемент С, то...
  20. S=realloc(S, (strlen(S)+strlen(S0)+1)*sizeof(char)); /// Увеличиваю память под строку на длину S0
  21. for (j=strlen(S); j>=i; j--) /// Совершаю сдвиг элементов строки S (включая символ конца строки) справа налево
  22. *(S+j+strlen(S0))=*(S+j); /// на число равное длине строки S0
  23. for (j=i, k=0; k<strlen(S0); j++, k++) /// Вставляю все элементы строки S0 в освободившееся из-за сдвига место в строке S,
  24. *(S+j)=S0[k]; /// кроме символа конца строки S0
  25. }
  26. puts(S);
  27. return 0;
  28. }
Выяснил, что загвоздка в этой части программы, так как цикл выполняется бесконечно:
Листинг программы
  1. for (j=strlen(S); j>=i; j--) /// Совершаю сдвиг элементов строки S (включая символ конца строки) справа налево
  2. *(S+j+strlen(S0))=*(S+j); /// на число равное длине строки S0
НЕ МОГУ ПОНЯТЬ, В ЧЕМ БЕДА!!1 Это ведь связано с дурацким символом конца строки? И как это исправить? Заранее благодарю!

Решение задачи: «Перед каждым вхождением символа C в строку S вставить строку S0»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4.  
  5. int str_insert(char** s, char c, const char* s0){
  6.     size_t l, n, m;
  7.     char*  t, *p = *s;
  8.  
  9.     m = strlen(s0);
  10.     l = 0;
  11.     while((p = strchr(p, c)) != NULL){
  12.         l += m;
  13.         ++p;
  14.     }
  15.     if(! l || ! *s0)
  16.         return 0;
  17.  
  18.     n = strlen(*s) + 1;
  19.     p = (char*)realloc(*s, (n + l) * sizeof(char));
  20.     if(p == NULL)
  21.         return 0;
  22.    
  23.     t = *s = p;
  24.     while((p = strchr(p, c)) != NULL){
  25.         memmove(p + m, p, (n - (size_t)(p - t)) * sizeof(char));
  26.         strncpy(p, s0, m);
  27.         p += m + 1;
  28.         n += m;
  29.     }
  30.     return 1;
  31. }
  32.  
  33.  
  34. int main(void){
  35.     char* s = strdup("X, X, (X), X, {X}XX");
  36.     if(s == NULL)
  37.         return 1;
  38.  
  39.     puts(s);
  40.     if(str_insert(&s, 'X', "Direct"))
  41.         puts(s);
  42.  
  43.     //...
  44.     free(s);
  45.     return 0;
  46. }

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

  1. Включаем необходимые заголовочные файлы для работы со строками и памятью
  2. Определяем функцию str_insert, которая принимает указатель на строку, символ, который необходимо вставить и строку, которую необходимо вставить
  3. Инициализируем переменные: m - длина строки, которую необходимо вставить, l - длина вставленной строки, t - указатель на текущий символ строки, p - указатель на текущий символ строки
  4. Используем функцию strlen для определения длины строки s0
  5. В цикле while ищем все вхождения символа c в строке s. Если символ найден, увеличиваем значение l на длину строки s0 и сдвигаем указатель p на следующую позицию в строке s
  6. Проверяем, были ли вхождения символа c и строки s0. Если нет, возвращаем 0. Иначе, продолжаем выполнение функции
  7. Вычисляем новую длину строки s с учетом вставленных строк s0
  8. Реализуем функцию realloc для выделения памяти под новую длину строки s. Если память не может быть выделена, возвращаем 0. Иначе, обновляем указатель на начало строки s и на текущую позицию в строке s
  9. Копируем строку s в новую выделенную память
  10. В цикле while вставляем строку s0 в нужное место в строке s. Для этого перемещаем символы, начиная с текущей позиции в строке s, на позицию, равную текущей позиции плюс длина строки s0. Затем копируем строку s0 в освободившуюся память
  11. Увеличиваем длину строки s на длину вставленной строки s0
  12. Возвращаем 1, если все операции выполнены успешно, и 0 в противном случае
  13. В функции main создаем строку s и выводим ее на экран
  14. Вызываем функцию str_insert для вставки строки Direct перед каждым вхождением символа 'X' в строке s. Выводим измененную строку s на экран
  15. Выполняем дополнительные действия, если необходимо
  16. Освобождаем память, выделенную под строку s
  17. Возвращаем 0, если все операции выполнены успешно, и 1 в противном случае

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


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

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

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы