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

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

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

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

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

На входе

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

На выходе

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

Пример#1

На входе

main Main word remains main.

На выходе

Main word remains.

Пример#2

На входе

b a += b * c - b

На выходе

a * c

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. //удаление слова
  6. char* remove_word(char* s, const char* w){
  7.     const char* b;
  8.     char* a, *p, *t = s;
  9.  
  10.     if((s = strstr(s, w)) == NULL)
  11.         return t;
  12.  
  13.     for(p = s; *s; *s = *p){
  14.         if((*p == *w) && (p == t || ! isalpha(*(p - 1)))){
  15.             a = p;
  16.             b = w;
  17.             while(*a && (*a == *b)){
  18.                 ++a;
  19.                 ++b;
  20.             }
  21.            
  22.             if(!*b && !isalpha(*a)){
  23.                 --s;
  24.                 while((s >= t) && !isalpha(*s))
  25.                     --s;
  26.                 ++s;
  27.                 p = a;
  28.             } else {
  29.                 while(p != a)
  30.                     *s++ = *p++;
  31.             }
  32.             continue;
  33.         }
  34.         ++s;
  35.         ++p;
  36.     }
  37.     return t;
  38. }
  39.  
  40. int main(void){
  41.     char s1[] = "Main word remains main.";
  42.     char s2[] = "a += b * c - b";
  43.  
  44.     puts(s1);
  45.     puts( remove_word(s1, "main") );
  46.     putchar('\n');
  47.  
  48.     puts(s2);
  49.     puts( remove_word(s2, "b") );
  50.     return 0;
  51. }

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

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

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


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

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

15   голосов , оценка 3.8 из 5

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

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

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