/* Эта программа предназначена для демонстрации применения функций "классификации и преобразования символов". Для получения символов применяются функции getchar и putchar из библиотеки stdio.
Задачи программы:
- Считать ввод из stdin
- Проверить, что все символы - печатаемые символы ascii
- Преобразовать все прописные символы строчные
- Удалить лишние пробелы
- Выдать статистику по типам символов
Эта программа демонстрирует применение следующих функций:
- getchar
- putchar
- isascii (ctype) 
- iscntrl (ctype) 
- isspace (ctype)
- isalnum (ctype)
- isdigit (ctype)
- isalpha (ctype)
- isupper (ctype)
- islower (ctype)
- ispunct (ctype) 
- tolower (conv)
- toascii ( conv)
*/
#include <stdio.h> /* Стандартный ввод-вывод */ #include <ctype.h> /* Функции для определения типа
символов */
/* Различные счетчики для статистики */
int asciicnt, printcnt, punctcnt, uppercnt, lowercnt,
digcnt, alnumcnt, cntrlcnt, spacecnt, totcnt, nonprntcnt, linecnt, tabcnt ;
main()
{
  
int ch ; /* Обрабатываемый символ */ char c , class_conv() ;
asciicnt=printcnt=punctcnt=uppercnt=lowercnt=digcnt==0; cntrlcnt=spacecnt=totcnt=nonprntcnt=linecnt=tabcnt=0; alnumcnt=0;
while ( (ch =getchar()) != EOF )
{
 
totcnt++; c = class_conv(ch) ; putchar(c);
}
printf("Введено %d\n строк", linecnt);
printf(" Распределение символов по категориям:\n");
printf(" TOTAL  ASCII  CNTRL   PUNCT   ALNUM  DIGITS UPPER
LOWER SPACE TABCNT\n");
printf("%5d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n",totcnt,
asciicnt, cntrlcnt, punctcnt, alnumcnt, digcnt, uppercnt,lowercnt, spacecnt, tabcnt );
}
char class_conv(ch)
char ch;
{
 
if (isascii(ch)) {
 
asciicnt++;
if ( iscntrl(ch) && ! isspace(ch)) {
 
nonprntcnt++ ;
cntrlcnt++ ;
return(' ');
 
}
else if ( isalnum(ch)) {
 
alnumcnt++;
if (isdigit(ch)){
digcnt++; return(ch);
}
else if (isalpha(ch)){
if ( isupper(ch) ){
uppercnt++ ; return(tolower(ch));
}
else if ( islower(ch) ){
lowercnt++; return(ch);
}
else {
/* Невозможная ситуация - символ алфавита должен быть либо строчным, либо прописным. */
fprintf(stderr,"Ошибка классификации %c \n",ch); return(NULL);
}
}
else if (ispunct(ch) ){
punctcnt++; return(ch);
}
else if ( isspace(ch) ){
spacecnt++;
if ( ch == '\n' ){
linecnt++;
return(ch);
}
while ( (ch == '\t' ) || ( ch == ' ' ) ) {
if ( ch == '\t' ) tabcnt ++ ;
else if ( ch == ' ' ) spacecnt++ ;
totcnt++;
ch = getchar();
}
ungetc(ch,stdin);
totcnt--;
return(' ');
}
else {
/* Невозможная ситуация - любой символ принадлежит одному из классов. */ fprintf(stderr,"Ошибка классификации %c \n",ch); return (NULL); }
}
else
{
fprintf(stdout,"Обнаружен не-ASCII символ\n"); return(toascii(ch));
}
}