Удалить из строки указанные слова вместе с предшествующими разделителями - C (СИ)

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

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

Удаление слов

Напишите программу, которая удаляет из строки указанные слова вместе с предшествующими разделителями. Словами будем считать непрерывные последовательности букв (непустые), все остальные символы будут разделителями слов. Регистр букв имеет значение. _________________________________________________________________________

На входе

В первой строчке записано слово, которое требуется удалить. Далее идёт строка (возможно, пустая), состоящая из латинских букв, цифр, знаков препинания и других печатных символов таблицы ASCII. Размер строки не более 100 печатных символов.
_________________________________________________________________________

На выходе

Строка, в которой удалены все совпадающие с заданным слова вместе с предшествующей группой разделителей, остальной текст при этом оставлен без изменений.
_________________________________________________________________________

Пример#1

На входе

main Main word remains main.

На выходе

Main word remains.

Пример#2

На входе

b a += b * c - b

На выходе

a * c

Решение задачи: «Удалить из строки указанные слова вместе с предшествующими разделителями»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
//удаление слова
char* remove_word(char* s, const char* w){
    const char* b;
    char* a, *p, *t = s;
 
    if((s = strstr(s, w)) == NULL)
        return t;
 
    for(p = s; *s; *s = *p){
        if((*p == *w) && (p == t || ! isalpha(*(p - 1)))){
            a = p;
            b = w;
            while(*a && (*a == *b)){
                ++a;
                ++b;
            }
            
            if(!*b && !isalpha(*a)){
                --s;
                while((s >= t) && !isalpha(*s))
                    --s;
                ++s;
                p = a;
            } else {
                while(p != a)
                    *s++ = *p++;
            }
            continue;
        }
        ++s;
        ++p;
    }
    return t;
}
 
int main(void){
    char s1[] = "Main word remains main.";
    char s2[] = "a += b * c - b";
 
    puts(s1);
    puts( remove_word(s1, "main") );
    putchar('\n');
 
    puts(s2);
    puts( remove_word(s2, "b") );
    return 0;
}

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

  1. Удаляет указанное слово из строки вместе с предшествующими разделителями.
  2. Если указанное слово не найдено в строке, возвращает исходную строку.
  3. Ищет первое вхождение указанного слова в строке.
  4. Если найденное слово является последним в строке и перед ним нет буквы, удаляет его.
  5. Если найденное слово не является последним в строке, проходит по всем символам между найденным словом и концом строки, проверяя, является ли текущий символ буквой.
  6. Если текущий символ является буквой и он следует за найденным словом, удаляет найденное слово и все символы перед ним.
  7. Если текущий символ не является буквой, пропускает его и переходит к следующему символу.
  8. Возвращает измененную строку.
  9. Выводит исходную строку.
  10. Выводит измененную строку.
  11. Выводит исходную строку.
  12. Выводит измененную строку.
  13. Возвращает 0.

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


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

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

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