Удалить заданную подстроку из исходной строки - C (СИ)

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

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

Помогите, пожалуйста. Надо написать программу, которая убирает заданную подстроку из исходной строки (без различия строчных и прописных букв). В строке может быть несколько одинаковых подстрок. Вводимые данные: исходная строка, строка, которую надо убрать. Выводимые данные: измененная строка и сообщение о том, производилась замена или нет.

Решение задачи: «Удалить заданную подстроку из исходной строки»

textual
Листинг программы
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
#include <string.h>
#include <locale.h>
#include <assert.h>
 
wchar_t * wcscasestr(const wchar_t * str, const wchar_t * sub) {
    const wchar_t * pStr = str;
    const wchar_t * pSub = sub;
    
    while ( *pSub != L'\0' && towupper((wint_t)*pStr) == towupper((wint_t)*pSub) ) {
        ++pStr;
        ++pSub;
    }
    
    return ( *pSub == L'\0' ) ? (wchar_t*)str : ( *pStr == L'\0' ) ? NULL : wcscasestr(str + 1, sub);
}
 
int remove_substring(wchar_t * str, const wchar_t * sub) {
    if ( str = wcscasestr(str, sub) ) {
        wchar_t * ptr = str + wcslen(sub);
        memmove(str, ptr, sizeof(wchar_t) * ( wcslen(ptr) + 1 ));
        
        return 1 + remove_substring(str, sub);
    }
    else
        return 0;
}
 
int main(void) {
    wchar_t str[256], sub[256];
    
    assert ( setlocale(LC_ALL, "ru_RU.UTF-8") );
    
    while (
        printf("Строка: ") > 0 &&
        scanf("%255l[^\n]%*c", str) == 1 &&
        printf("Подстрока: ") > 0 &&
        scanf("%255l[^\n]%*c", sub) == 1
    ) {
        int found = remove_substring(str, sub);
        printf("Результат: %ls\nНайдено %d вхождений.\n", str, found);
    }
    
    return 0;
}

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

  1. В функции wcscasestr происходит поиск подстроки в строке.
  2. Если подстрока найдена, то в функции remove_substring происходит перемещение символов в строке, начиная с указателя на последний символ подстроки, для удаления этой подстроки.
  3. Функция remove_substring вызывает саму себя рекурсивно, чтобы найти все вхождения подстроки и удалить их.
  4. В функции main происходит считывание строки и подстроки с помощью scanf, а затем вызов функции remove_substring и вывод результата на экран.
  5. После выполнения всех операций программа возвращает 0, заканчивая свою работу.

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


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

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

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