1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <ctype.h> 4 5 int is_not_print( int ch ) 6 { 7 return !isprint( ch ); 8 } 9 10 static int(*test_func[])( int ) = { 11 iscntrl, 12 isspace, 13 isdigit, 14 islower, 15 isupper, 16 ispunct, 17 is_not_print 18 }; 19 #define N_CATEGORIES ( sizeof( test_func ) / sizeof( test_func[0] ) ) 20 21 char* label[] = { 22 "control", 23 "whitespace", 24 "digit", 25 "lower case", 26 "upper case", 27 "punctuation", 28 "non-printable" 29 }; 30 31 int count[ N_CATEGORIES ]; 32 int total; 33 34 int main() 35 { 36 int ch; 37 int category; 38 39 while( (ch = getchar()) != EOF ) 40 { 41 total += 1; 42 for( category = 0; category < N_CATEGORIES; category += 1 ) 43 if( test_func[ category ]( ch ) ) 44 count[ category ] += 1; 45 } 46 47 if( total == 0 ) 48 printf( "No characters in the input!\n" ); 49 else 50 { 51 for( category = 0; category < N_CATEGORIES; category += 1 ) 52 { 53 printf( "%3.0f%% %s characters\n", count[ category ] * 100.0 / total, label[ category ] ); 54 } 55 } 56 return EXIT_SUCCESS; 57 }