Найти число слов, которые оканчиваются той же буквой, что и последнее слово. Вывести их на экран - C (СИ)
Формулировка задачи:
Дана строка длиной n символов, содержащая слова, т.е. группы
символов, разделенные пробелами и другими разделителями (знаками
препинания) и не содержащие пробелов внутри себя.
Найти число слов, которые оканчиваются той же буквой, что и последнее слово. Вывести их на экран.
Помогите, пожалуйста. Заранее спасибо!
Решение задачи: «Найти число слов, которые оканчиваются той же буквой, что и последнее слово. Вывести их на экран»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
static char last_char(const char* s);
int print_words(FILE* _out, const char* s);
int main(void){
char s[] = "PASCAL, PERL, PYTHON, ALGOL, LISP, SNOBOL, APL...";
int m = print_words(stdout, s);
printf("count words: %d\n", m);
return 0;
}
int print_words(FILE* _out, const char* s){
int n = 0, m = 0;
char c = last_char(s);
while(*s){
n = 0;
sscanf(s, "%*[^a-zA-Z]%n", &n);
s += n;
if(!*s)
break;
sscanf(s, "%*[a-zA-Z]%n", &n);
if(*(s + (n - 1)) == c){
fprintf(_out, "%.*s\n", n, s);
++m;
}
s += n;
}
return m;
}
static char last_char(const char* s){
const size_t n = strlen(s);
const char* p = (n > 0) ? s + (n - 1) : s;
while((p >= s) && !isalpha(*p))
--p;
return (p > s) ? *p : '\0';
}
Объяснение кода листинга программы
В этом коде:
- Объявлены три функции:
last_char,print_wordsиmain. - В функции
mainинициализируется массивsстрокойPASCAL, PERL, PYTHON, ALGOL, LISP, SNOBOL, APL.... - Вызывается функция
print_wordsс аргументамиstdoutиs. - Результат работы функции
print_wordsприсваивается переменнойm, которая выводится на экран. - В функции
print_wordsинициализируются две переменные:nиmсо значением 0. - Определяется значение последней буквы строки
sс помощью функцииlast_char. - В цикле
whileпроисходит чтение строкиs. - Внутри цикла переменной
nприсваивается значение количества символов, которые не являются буквами, а переменнойsсдвигается на следующую позицию. - Если текущий символ не является буквой, то в переменную
nсчитывается количество символов, которые являются буквами. - Если текущий символ является буквой, то проверяется, равна ли последняя буква строки этой букве.
- Если условие выполняется, то текущее слово выводится на экран и к переменной
mприбавляется единица. - После выхода из цикла, возвращается значение переменной
m. - В функции
last_charопределяется позиция последней буквы строкиs. - Если строка пустая, то возвращается 0.
- Если текущий символ не является буквой, то сдвигаемся на предыдущую позицию и повторяем проверку.
- Если текущий символ является буквой, то возвращается он.