Перед каждым вхождением символа C в строку S вставить строку S0 - C (СИ)
Формулировка задачи:
Гайз, прошу вашей помощи. Пытаюсь решить следующую задачу: "Дан символ C и строки S, S0. Перед каждым вхождением символа C в строку S вставить строку S0." Знаю, что ее можно и наверное будет проще решить использую различные функции библиотеки string.h, но хочу решить ее методом, продемонстрированным ниже, если это возможно.
Помощь нужна в поиске ошибки, т.к. программа работает неисправно.
Код программы:
Выяснил, что загвоздка в этой части программы, так как цикл выполняется бесконечно:
НЕ МОГУ ПОНЯТЬ, В ЧЕМ БЕДА!!1 Это ведь связано с дурацким символом конца строки? И как это исправить?
Заранее благодарю!
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <string.h>
- int main()
- {
- setlocale (2, "RUSSIAN");
- int i, j, k;
- char *S, S0[256], C;
- S=(char *)malloc(256*sizeof(char));
- printf("Программа вставляет строку S0 перед каждым вхождением символа C в строку S.\n\n");
- printf("Введите строку S: ");
- gets(S);
- printf("Введите строку S_0: ");
- gets(S0);
- printf("Введите символ С: ");
- C=getchar();
- for (i=0; i<strlen(S); i++) /// Бегу по всем элементам строки S слева направо
- if (*(S+i)==C) { /// Если нашел в строке элемент С, то...
- S=realloc(S, (strlen(S)+strlen(S0)+1)*sizeof(char)); /// Увеличиваю память под строку на длину S0
- for (j=strlen(S); j>=i; j--) /// Совершаю сдвиг элементов строки S (включая символ конца строки) справа налево
- *(S+j+strlen(S0))=*(S+j); /// на число равное длине строки S0
- for (j=i, k=0; k<strlen(S0); j++, k++) /// Вставляю все элементы строки S0 в освободившееся из-за сдвига место в строке S,
- *(S+j)=S0[k]; /// кроме символа конца строки S0
- }
- puts(S);
- return 0;
- }
Листинг программы
- for (j=strlen(S); j>=i; j--) /// Совершаю сдвиг элементов строки S (включая символ конца строки) справа налево
- *(S+j+strlen(S0))=*(S+j); /// на число равное длине строки S0
Решение задачи: «Перед каждым вхождением символа C в строку S вставить строку S0»
textual
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- int str_insert(char** s, char c, const char* s0){
- size_t l, n, m;
- char* t, *p = *s;
- m = strlen(s0);
- l = 0;
- while((p = strchr(p, c)) != NULL){
- l += m;
- ++p;
- }
- if(! l || ! *s0)
- return 0;
- n = strlen(*s) + 1;
- p = (char*)realloc(*s, (n + l) * sizeof(char));
- if(p == NULL)
- return 0;
- t = *s = p;
- while((p = strchr(p, c)) != NULL){
- memmove(p + m, p, (n - (size_t)(p - t)) * sizeof(char));
- strncpy(p, s0, m);
- p += m + 1;
- n += m;
- }
- return 1;
- }
- int main(void){
- char* s = strdup("X, X, (X), X, {X}XX");
- if(s == NULL)
- return 1;
- puts(s);
- if(str_insert(&s, 'X', "Direct"))
- puts(s);
- //...
- free(s);
- return 0;
- }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со строками и памятью
- Определяем функцию str_insert, которая принимает указатель на строку, символ, который необходимо вставить и строку, которую необходимо вставить
- Инициализируем переменные: m - длина строки, которую необходимо вставить, l - длина вставленной строки, t - указатель на текущий символ строки, p - указатель на текущий символ строки
- Используем функцию strlen для определения длины строки s0
- В цикле while ищем все вхождения символа c в строке s. Если символ найден, увеличиваем значение l на длину строки s0 и сдвигаем указатель p на следующую позицию в строке s
- Проверяем, были ли вхождения символа c и строки s0. Если нет, возвращаем 0. Иначе, продолжаем выполнение функции
- Вычисляем новую длину строки s с учетом вставленных строк s0
- Реализуем функцию realloc для выделения памяти под новую длину строки s. Если память не может быть выделена, возвращаем 0. Иначе, обновляем указатель на начало строки s и на текущую позицию в строке s
- Копируем строку s в новую выделенную память
- В цикле while вставляем строку s0 в нужное место в строке s. Для этого перемещаем символы, начиная с текущей позиции в строке s, на позицию, равную текущей позиции плюс длина строки s0. Затем копируем строку s0 в освободившуюся память
- Увеличиваем длину строки s на длину вставленной строки s0
- Возвращаем 1, если все операции выполнены успешно, и 0 в противном случае
- В функции main создаем строку s и выводим ее на экран
- Вызываем функцию str_insert для вставки строки
Direct
перед каждым вхождением символа 'X' в строке s. Выводим измененную строку s на экран - Выполняем дополнительные действия, если необходимо
- Освобождаем память, выделенную под строку s
- Возвращаем 0, если все операции выполнены успешно, и 1 в противном случае
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д