Строки в С - 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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со строками, файлами и символами.
- Определяем две функции:
remove_word
иremove_word_end
. - В функции
main
считываем строку и слово для удаления. - Используем функцию
remove_word
для удаления слова из строки. - Если слово успешно удалено, используем функцию
remove_word_end
для удаления последнего слова из оставшейся строки. - Выводим полученную строку.
- Используем
fflush(stdin)
для очистки буфера ввода. - Получаем символ конца файла с помощью
getchar()
. - Возвращаем 0, чтобы указать, что программа успешно завершилась.
- В функции
remove_word
ищем первое вхождение указанного слова в строке. - Если слово найдено, инициализируем переменные
m
(длина слова) иp
(указатель на текущий символ). - Перебираем символы в строке до тех пор, пока не встретим символ, следующий за последним символом слова.
- Если текущий символ равен текущему символу слова и предыдущий символ является разделителем, удаляем слово.
- Возвращаем количество удаленных слов.
- В функции
remove_word_end
инициализируем переменныеw
(удаляемое слово) иm
(длина слова). - Перебираем символы в строке до тех пор, пока не встретим символ, следующий за последним символом слова.
- Если текущий символ не является разделителем, увеличиваем счетчик
i
(количество символов, которые мы пропустили). - Если
i
больше 0, то мы нашли последнее вхождение слова, копируем оставшуюся строку с последнего вхождения слова и удаляем ее начальную часть. - Возвращаем измененную копию исходной строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д