Вывести список слов, имеющих приставку (несколько букв), задаваемую с клавиатуры - C (СИ)
Формулировка задачи:
Текст вводится с клавиатуры в строку, слова разделены пробелом или запятой.
Нужно вывести список слов, имеющих приставку (несколько букв), задаваемую с клавиатуры.
Решение задачи: «Вывести список слов, имеющих приставку (несколько букв), задаваемую с клавиатуры»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void output_w(FILE* _out, const char* s, const char* pfx){
const char* p = s;
const size_t n = strlen(pfx);
while((p = strstr(p, pfx)) != NULL){
if((p == s) || ! isalpha(*(p - 1))){
if(! strncmp(p, pfx, n)){
while(isalpha(*p))
fputc(*p++, _out);
fputc('\n', _out);
continue;
}
}
p += n;
}
}
int main(void){
char buf[64] = "hello, apply, apple, application, ap";
char pfx[16] = "app";
/*
printf("Enter str: ");
fgets(buf, sizeof(buf), stdin);
printf("Enter prefix: ");
scanf("%s", pfx);
fflush(stdin);
*/
output_w(stdout, buf, pfx);
return 0;
}
Объяснение кода листинга программы
В этом коде реализована функция вывода слов, начинающихся с заданной приставки. Список элементов кода:
- #include
Включает в себя файл стандартного ввода/вывода, который содержит определения функций для работы с консолью. - #include
Включает в себя файл с функциями для работы со строками, такими как проверка на цифры или буквы. - #include
Включает в себя файл со стандартными функциями для работы со строками, такими как функция сравнения строк. - *void output_w(FILE _out, const char s, const char pfx)** Это функция, которая принимает три аргумента: файл для вывода, строку для обработки и строку-приставку.
- *const char p = s;** Здесь p - это указатель на первый символ строки s.
- const size_t n = strlen(pfx); Здесь n - это длина строки-приставки.
- while((p = strstr(p, pfx)) != NULL){ Этот цикл будет выполняться до тех пор, пока не найдется null-терминатор в строке s или пока не будет найдена последовательность символов, соответствующая строке-приставке.
- *if((p == s) || ! isalpha((p - 1))){** Этот блок условий проверяет, является ли текущий символ буквой, и если нет, то пропускает его.
- if(! strncmp(p, pfx, n)){ Этот блок условий проверяет, совпадает ли последовательность символов с строкой-приставкой.
- *while(isalpha(p))** Этот цикл будет выполняться до тех пор, пока текущий символ не перестанет быть буквой.
- *fputc(p++, _out);** Здесь выводится текущий символ.
- fputc('\n', _out); После вывода слова выводится символ новой строки.
- continue; После вывода слова программа возвращается к началу цикла, чтобы проверить следующее слово.
- } Завершается блок условий для проверки строки-приставки.
- p += n; Указатель p сдвигается на длину строки-приставки.
- } Завершается цикл while.
- int main(void){ Это функция, которая не принимает аргументов и представляет собой точку входа в программу.
- char buf[64] =
hello, apply, apple, application, ap; Здесь определена строка, которую нужно обработать. - char pfx[16] =
app; Здесь определена строка-приставка. - printf(
Enter str:); Выводится приглашение для ввода строки. - fflush(stdin); Очищается буфер ввода, чтобы можно было ввести следующую строку.
- fgets(buf, sizeof(buf), stdin); Вводится строка с клавиатуры.
- printf(
Enter prefix:); Выводится приглашение для ввода строки-приставки. - scanf(
%s, pfx); Вводится строка-приставка с клавиатуры. - output_w(stdout, buf, pfx); Вызывается функция вывода с введенными данными.
- return 0; Завершается функция main.