Строки в С - C (СИ) (248836)

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

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

Здравствуйте, мне нужно сделать программу исключительно для Visual Studio13 Задание:Разработать функцию, определяющую, встречается ли заданное слово в строке. Если в строке встречается заданное слово, удалить его, иначе удалить последнее слово строки. Строка вводится с терминала.. Заранее благодарен за ответ

Решение задачи: «Строки в С»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define isdelim(c) (isspace((c)) || ispunct((c)))
#define W_MAX      32
#define S_MAX      128
size_t remove_word(char* s, const char* w);
char*  remove_word_end(char* s);
 
int main(void){
    char s[S_MAX], w[W_MAX];
 
    printf("Enter str: ");
    fgets(s, S_MAX, stdin);
 
    printf("Enter word: ");
    scanf("%31[^\n]", w);
 
    if(!remove_word(s, w))
        remove_word_end(s);
 
    puts(s);
 
    fflush(stdin);
    getchar();
    return 0;
}
 
//удаление указанного слова
size_t remove_word(char* s, const char* w){
    size_t n, m;
    char*  p, *t = s;
    if((s = strstr(s, w)) == NULL)
        return 0;
 
    m = strlen(w);
    for(n = 0, p = s; *s; *s = *p){
        if((*p == *w) && (p == t || isdelim(*(p - 1)))){
            
            if(!strncmp(p, w, m) && (!*(p + m) || isdelim(*(p + m)))){
                p += m;
                ++n;
                continue;
            }
        }
        ++s, ++p;
    }
    return n;
}
 
//удаление последнего слова
char* remove_word_end(char* s){
    char*  w = NULL;
    size_t i = 0, m = 0;
    char*  t = s;
    do {
        if(*s && !isdelim(*s))
            ++i;
        else if(i > 0){
            w = s - i;
            m = i;
            i = 0;
        }
    } while(*s++ != '\0');
 
    if(w != NULL)
        strcpy(w, w + m);
    return t;
}

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

  1. Включаем необходимые заголовочные файлы для работы со строками, файлами и символами.
  2. Определяем две функции: remove_word и remove_word_end.
  3. В функции main считываем строку и слово для удаления.
  4. Используем функцию remove_word для удаления слова из строки.
  5. Если слово успешно удалено, используем функцию remove_word_end для удаления последнего слова из оставшейся строки.
  6. Выводим полученную строку.
  7. Используем fflush(stdin) для очистки буфера ввода.
  8. Получаем символ конца файла с помощью getchar().
  9. Возвращаем 0, чтобы указать, что программа успешно завершилась.
  10. В функции remove_word ищем первое вхождение указанного слова в строке.
  11. Если слово найдено, инициализируем переменные m (длина слова) и p (указатель на текущий символ).
  12. Перебираем символы в строке до тех пор, пока не встретим символ, следующий за последним символом слова.
  13. Если текущий символ равен текущему символу слова и предыдущий символ является разделителем, удаляем слово.
  14. Возвращаем количество удаленных слов.
  15. В функции remove_word_end инициализируем переменные w (удаляемое слово) и m (длина слова).
  16. Перебираем символы в строке до тех пор, пока не встретим символ, следующий за последним символом слова.
  17. Если текущий символ не является разделителем, увеличиваем счетчик i (количество символов, которые мы пропустили).
  18. Если i больше 0, то мы нашли последнее вхождение слова, копируем оставшуюся строку с последнего вхождения слова и удаляем ее начальную часть.
  19. Возвращаем измененную копию исходной строки.

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


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

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

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