C/C++

Нужен код на Си помогите пж

С клавиатуры вводится текстовая строчка. Разработать программу, реализующую указанные действия.
а) подсчитывает количество слов в тексте, оканчивающихся на гласную букву; б) выводит на
экран все слова, длина которых меньше пяти символов.
/*
Программа рассчитана на английский язык.
В русском языке в кодировках, например UTF-8,
может использоваться для буквы больше одного байта,
в моём случае 2.
И нужно использовать wchar_t.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char alphabet[] = "aAbBcCdDeEfFGghHiIjJkKlLMmNnOoPpQqRrSsTtUuVvWwXxYyZz"; /* 26*2 = 52 */
const char glassnye[] = "aAEeIiOoUuYy"; /* 6*2 = 12 */

int is_letter(const char c)
{
for(int x = 0; x < 52; x++)
if(c == alphabet[x]) return 1;
return 0;
}

int is_glassnaja(const char c)
{
for(int x = 0; x < 12; x++)
if(c == glassnye[x]) return 1;
return 0;
}

int main()
{
const int size = 1024;
char * str;
str = (char *) malloc(size);

gets(str); /* ввод строки с клавиатуры */
int len = strlen(str); /* длина строки */
int count_glas = 0; /* для подсчёта слов, оканчивающихся на глассные */
int word_len = 0; /* для подсчёта длины слова */
/* нужно прокрутить строку */
for(int x = 0; x < len; x++)
{
if( is_letter(str[x]) )
{
word_len++;
if( ! is_letter(str[x + 1]) )
{ /* если следующий символ -- не буква */
if( is_glassnaja(str[x]) )
{ /* если последний символ слова -- гласная */
count_glas++;
}
if(word_len < 5) /* елси длина слова меньше пяти символов */
{
for(int y = x - word_len + 1; y <= x; y++) /* печатаем слово */
putchar(str[y]);
putchar('\n');
}
}
}
else
{
word_len = 0;
}
}

printf("Количество слов в строке, оканчивающихся на глассную -- %d.\n", count_glas);

free(str);
str = NULL;

return 0;
}
VN
Vadim Nikiforov
83 796
Лучший ответ
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define BUFFER 1024
_Bool is_vowel_en(char ch) {
int i = 0, n = 6;
const char* vowel = "aeiouyAEIOUY";
do if (ch == vowel[i]) break; while (++i < n);
return i != n;
}
_Bool is_vowel_ru(char ch) {
int i = 0, n = 6;
const char* vowel = "аеёиоуыэюяАЕЁИОУЫЭЮЯ";
do if (ch == vowel[i]) break; while (++i < n);
return i != n;
}
void function(char* token, unsigned* count, unsigned limit) {
if (token) {
unsigned length = strlen(token);
if (is_vowel_en(token[length - 1]) || is_vowel_ru(token[length - 1])) ++(*count);
if (length < limit) puts(token);
}
}
int main(void) {
char line[BUFFER] = { 0 };
unsigned count = 0U;
char* token = NULL;
char* next_token = NULL;
unsigned limit = 5;
system("chcp 1251 > nul");
printf("Введите строку: ");
fgets(line, BUFFER, stdin);
line[strlen(line) - 1] = 0;
token = strtok_s(line, " ", &next_token);
function(token, &count, limit);
while (token != NULL) {
token = strtok_s(NULL, " ", &next_token);
function(token, &count, limit);
}
printf("Количество: %u\n", count);
system("pause > nul");
return 0;
}