// **************************************************
// Function: getStringStats
//
// Description: analyzes a string and returns counts
// of different character types
//
// Parameters: s[] - input string
//
// Returns: structure containing all statistics
//
// **************************************************
#include <stdio.h>
#include <ctype.h>
// structure definition
struct stringStats
{
int totalCharacters; //number of total characters in the string
int upperCaseCount; // number of upper case characters
int lowerCaseCount; // number of lower case characters
int digitCount; // number of digits
int blankSpaceCount; // number of blank spaces
int nonAlnumCount; // number of non-alphanumeric characters.
int vowelCount; // number of vowels (the letters a, e, i, o, u) ... accept upper and lower case
int nonVowelCount; // number of non-vowels ... accept upper and lower case
int specialCharCount; // number of special characters
int printableNonAlnumCount; // all printable characters that are neither alphanumeric nor a space. For example ‘@’, ‘$’, etc.
int hexCount; // number of hexadecimal "digits" - 0 through 9 ... and the letters A - F ... accept upper and lower case
int octalCount; // number of octal "digits" - 0 to 7
int binaryCount; // number of binary "digits" - 0 or 1
int punctCount; // number of punctuator characters. Punctuation as defined by this function includes all printable characters that are neither alphanumeric nor a
//space. For example ‘@’, ‘$’, etc
int controlCount; // number of control characters, control characters are those between ASCII codes 0x00 (NUL) and 0x1f (US), plus 0x7f (DEL)
int printableCount; // number of printable characters, a character is known as printable character if it occupies printing space.
} ;
// function prototype
struct stringStats getStringStats( char s[ ] ) ;
int main( )
{
char input[ 100 ] ;
struct stringStats result;
// get input
fgets ( input
, sizeof ( input
) , stdin
) ;
// call function
result = getStringStats( input) ;
// display results
printf ( "\n Total Characters: %d" , result.
totalCharacters ) ; printf ( "\n Uppercase: %d" , result.
upperCaseCount ) ; printf ( "\n Lowercase: %d" , result.
lowerCaseCount ) ; printf ( "\n Digits: %d" , result.
digitCount ) ; printf ( "\n Blank Spaces: %d" , result.
blankSpaceCount ) ; printf ( "\n Non-Alphanumeric: %d" , result.
nonAlnumCount ) ; printf ( "\n Vowels: %d" , result.
vowelCount ) ; printf ( "\n Non-Vowels: %d" , result.
nonVowelCount ) ; printf ( "\n Special Characters: %d" , result.
specialCharCount ) ; printf ( "\n Printable Non-Alnum (not space): %d" , result.
printableNonAlnumCount ) ; printf ( "\n Hex Digits: %d" , result.
hexCount ) ; printf ( "\n Octal Digits: %d" , result.
octalCount ) ; printf ( "\n Binary Digits: %d" , result.
binaryCount ) ; printf ( "\n Punctuation: %d" , result.
punctCount ) ; printf ( "\n Control Characters: %d" , result.
controlCount ) ; printf ( "\n Printable Characters: %d\n " , result.
printableCount ) ;
return 0 ;
}
struct stringStats getStringStats( char s[ ] )
{
//intialize structure
struct stringStats st = { 0 } ;
int i;
//loop to test each character in string
for ( i = 0 ; s[ i] != '\0 ' ; ++ i)
{
char c = s[ i] ;
//count the total number of characters
++ st.totalCharacters ;
//count uppercase
{
++ st.upperCaseCount ;
} //if
//count lowercase
{
++ st.lowerCaseCount ;
} //if
//count digits
{
++ st.digitCount ;
} //if
//count spaces
{
++ st.blankSpaceCount ;
} //if
//count non alphanumeric characters
++ st.nonAlnumCount ;
} //if
//count vowels and non vowels, accepts upper and lowercase
{
if ( l== 'a' || l== 'e' || l== 'i' || l== 'o' || l== 'u' )
{
++ st.vowelCount ;
} //if
else
{
++ st.nonVowelCount ;
} //else
} //if
// count special characters
{
++ st.specialCharCount ;
} //if
// counts printable but not alphanumeric and not space
{
++ st.printableNonAlnumCount ;
++ st.punctCount ;
} //if
//count hex digits
{
++ st.hexCount ;
} //if
//count octal digits
if ( c >= '0' && c <= '7' )
{
++ st.octalCount ;
} //if
//count binary digits
if ( c == '0' || c == '1' )
{
++ st.binaryCount ;
} //if
//count control characters
{
++ st.controlCount ;
} //if
//count printable characters
{
++ st.printableCount ;
} //if
} //for
//return structure
return st;
}
Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gRnVuY3Rpb246IGdldFN0cmluZ1N0YXRzCi8vCi8vIERlc2NyaXB0aW9uOiBhbmFseXplcyBhIHN0cmluZyBhbmQgcmV0dXJucyBjb3VudHMKLy8gICAgICAgICAgICAgIG9mIGRpZmZlcmVudCBjaGFyYWN0ZXIgdHlwZXMKLy8KLy8gUGFyYW1ldGVyczogc1tdIC0gaW5wdXQgc3RyaW5nCi8vCi8vIFJldHVybnM6IHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBzdGF0aXN0aWNzCi8vCi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgovLyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgpzdHJ1Y3Qgc3RyaW5nU3RhdHMKewogICAgaW50IHRvdGFsQ2hhcmFjdGVyczsgLy9udW1iZXIgb2YgdG90YWwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nCiAgICBpbnQgdXBwZXJDYXNlQ291bnQ7IC8vIG51bWJlciBvZiB1cHBlciBjYXNlIGNoYXJhY3RlcnMKICAgIGludCBsb3dlckNhc2VDb3VudDsgLy8gbnVtYmVyIG9mIGxvd2VyIGNhc2UgY2hhcmFjdGVycwogICAgaW50IGRpZ2l0Q291bnQ7IC8vIG51bWJlciBvZiBkaWdpdHMKICAgIGludCBibGFua1NwYWNlQ291bnQ7IC8vIG51bWJlciBvZiBibGFuayBzcGFjZXMKICAgIGludCBub25BbG51bUNvdW50OyAvLyBudW1iZXIgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgogICAgaW50IHZvd2VsQ291bnQ7IC8vIG51bWJlciBvZiB2b3dlbHMgKHRoZSBsZXR0ZXJzIGEsIGUsIGksIG8sIHUpICAgLi4uIGFjY2VwdCB1cHBlciBhbmQgbG93ZXIgY2FzZQogICAgaW50IG5vblZvd2VsQ291bnQ7IC8vIG51bWJlciBvZiBub24tdm93ZWxzIC4uLiBhY2NlcHQgdXBwZXIgYW5kIGxvd2VyIGNhc2UKICAgIGludCBzcGVjaWFsQ2hhckNvdW50OyAvLyBudW1iZXIgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzCiAgICBpbnQgcHJpbnRhYmxlTm9uQWxudW1Db3VudDsgLy8gYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5laXRoZXIgYWxwaGFudW1lcmljIG5vciBhIHNwYWNlLiBGb3IgZXhhbXBsZSDigJhA4oCZLCDigJgk4oCZLCBldGMuCiAgICBpbnQgaGV4Q291bnQ7IC8vIG51bWJlciBvZiBoZXhhZGVjaW1hbCAiZGlnaXRzIiAtIDAgdGhyb3VnaCA5IC4uLiBhbmQgdGhlIGxldHRlcnMgQSAtIEYgLi4uIGFjY2VwdCB1cHBlciBhbmQgbG93ZXIgY2FzZQogICAgaW50IG9jdGFsQ291bnQ7IC8vIG51bWJlciBvZiBvY3RhbCAiZGlnaXRzIiAtIDAgdG8gNwogICAgaW50IGJpbmFyeUNvdW50OyAvLyBudW1iZXIgb2YgYmluYXJ5ICJkaWdpdHMiIC0gMCBvciAxCiAgICBpbnQgcHVuY3RDb3VudDsgLy8gbnVtYmVyIG9mIHB1bmN0dWF0b3IgY2hhcmFjdGVycy4gUHVuY3R1YXRpb24gYXMgZGVmaW5lZCBieSB0aGlzIGZ1bmN0aW9uIGluY2x1ZGVzIGFsbCBwcmludGFibGUgY2hhcmFjdGVycyB0aGF0IGFyZSBuZWl0aGVyIGFscGhhbnVtZXJpYyBub3IgYQogICAgICAgICAgICAgICAgICAgIC8vc3BhY2UuIEZvciBleGFtcGxlIOKAmEDigJksIOKAmCTigJksIGV0YwogICAgaW50IGNvbnRyb2xDb3VudDsgLy8gbnVtYmVyIG9mIGNvbnRyb2wgY2hhcmFjdGVycywgY29udHJvbCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBiZXR3ZWVuIEFTQ0lJIGNvZGVzIDB4MDAgKE5VTCkgYW5kIDB4MWYgKFVTKSwgcGx1cyAweDdmIChERUwpCiAgICBpbnQgcHJpbnRhYmxlQ291bnQ7IC8vIG51bWJlciBvZiBwcmludGFibGUgY2hhcmFjdGVycywgYSBjaGFyYWN0ZXIgaXMga25vd24gYXMgcHJpbnRhYmxlIGNoYXJhY3RlciBpZiBpdCBvY2N1cGllcyBwcmludGluZyBzcGFjZS4KfTsKCi8vIGZ1bmN0aW9uIHByb3RvdHlwZQpzdHJ1Y3Qgc3RyaW5nU3RhdHMgZ2V0U3RyaW5nU3RhdHMoY2hhciBzW10pOwoKaW50IG1haW4oKQp7CiAgICBjaGFyIGlucHV0WzEwMF07CiAgICBzdHJ1Y3Qgc3RyaW5nU3RhdHMgcmVzdWx0OwoKICAgIC8vIGdldCBpbnB1dAogICAgcHJpbnRmKCJFbnRlciBhIHN0cmluZzogIik7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOwoKICAgIC8vIGNhbGwgZnVuY3Rpb24KICAgIHJlc3VsdCA9IGdldFN0cmluZ1N0YXRzKGlucHV0KTsKCiAgICAvLyBkaXNwbGF5IHJlc3VsdHMKICAgIHByaW50ZigiXG5Ub3RhbCBDaGFyYWN0ZXJzOiAlZCIsIHJlc3VsdC50b3RhbENoYXJhY3RlcnMpOwogICAgcHJpbnRmKCJcblVwcGVyY2FzZTogJWQiLCByZXN1bHQudXBwZXJDYXNlQ291bnQpOwogICAgcHJpbnRmKCJcbkxvd2VyY2FzZTogJWQiLCByZXN1bHQubG93ZXJDYXNlQ291bnQpOwogICAgcHJpbnRmKCJcbkRpZ2l0czogJWQiLCByZXN1bHQuZGlnaXRDb3VudCk7CiAgICBwcmludGYoIlxuQmxhbmsgU3BhY2VzOiAlZCIsIHJlc3VsdC5ibGFua1NwYWNlQ291bnQpOwogICAgcHJpbnRmKCJcbk5vbi1BbHBoYW51bWVyaWM6ICVkIiwgcmVzdWx0Lm5vbkFsbnVtQ291bnQpOwogICAgcHJpbnRmKCJcblZvd2VsczogJWQiLCByZXN1bHQudm93ZWxDb3VudCk7CiAgICBwcmludGYoIlxuTm9uLVZvd2VsczogJWQiLCByZXN1bHQubm9uVm93ZWxDb3VudCk7CiAgICBwcmludGYoIlxuU3BlY2lhbCBDaGFyYWN0ZXJzOiAlZCIsIHJlc3VsdC5zcGVjaWFsQ2hhckNvdW50KTsKICAgIHByaW50ZigiXG5QcmludGFibGUgTm9uLUFsbnVtIChub3Qgc3BhY2UpOiAlZCIsIHJlc3VsdC5wcmludGFibGVOb25BbG51bUNvdW50KTsKICAgIHByaW50ZigiXG5IZXggRGlnaXRzOiAlZCIsIHJlc3VsdC5oZXhDb3VudCk7CiAgICBwcmludGYoIlxuT2N0YWwgRGlnaXRzOiAlZCIsIHJlc3VsdC5vY3RhbENvdW50KTsKICAgIHByaW50ZigiXG5CaW5hcnkgRGlnaXRzOiAlZCIsIHJlc3VsdC5iaW5hcnlDb3VudCk7CiAgICBwcmludGYoIlxuUHVuY3R1YXRpb246ICVkIiwgcmVzdWx0LnB1bmN0Q291bnQpOwogICAgcHJpbnRmKCJcbkNvbnRyb2wgQ2hhcmFjdGVyczogJWQiLCByZXN1bHQuY29udHJvbENvdW50KTsKICAgIHByaW50ZigiXG5QcmludGFibGUgQ2hhcmFjdGVyczogJWRcbiIsIHJlc3VsdC5wcmludGFibGVDb3VudCk7CgogICAgcmV0dXJuIDA7Cn0KCnN0cnVjdCBzdHJpbmdTdGF0cyBnZXRTdHJpbmdTdGF0cyhjaGFyIHNbXSkKewoJLy9pbnRpYWxpemUgc3RydWN0dXJlCiAgICBzdHJ1Y3Qgc3RyaW5nU3RhdHMgc3QgPSB7MH07CiAgICBpbnQgaTsKCiAgICAvL2xvb3AgdG8gdGVzdCBlYWNoIGNoYXJhY3RlciBpbiBzdHJpbmcKICAgIGZvcihpID0gMDsgc1tpXSAhPSAnXDAnOyArK2kpCiAgICB7CiAgICAgICAgY2hhciBjID0gc1tpXTsKICAgICAgICAvL2NvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycwogICAgICAgICsrc3QudG90YWxDaGFyYWN0ZXJzOwoJCS8vY291bnQgdXBwZXJjYXNlIAogICAgICAgIGlmKGlzdXBwZXIoYykpCiAgICAgICAgewogICAgICAgIAkrK3N0LnVwcGVyQ2FzZUNvdW50OwogICAgICAgIH0vL2lmCiAgICAgICAgLy9jb3VudCBsb3dlcmNhc2UKICAgICAgICBpZihpc2xvd2VyKGMpKQogICAgICAgIHsKICAgICAgICAJKytzdC5sb3dlckNhc2VDb3VudDsKICAgICAgICB9Ly9pZgogICAgICAgIC8vY291bnQgZGlnaXRzCiAgICAgICAgaWYoaXNkaWdpdChjKSkKICAgICAgICB7CiAgICAgICAgCSsrc3QuZGlnaXRDb3VudDsKICAgICAgICB9Ly9pZgogICAgICAgIC8vY291bnQgc3BhY2VzCiAgICAgICAgaWYoaXNzcGFjZShjKSkKICAgICAgICB7CiAgICAgICAgCSArK3N0LmJsYW5rU3BhY2VDb3VudDsKICAgICAgICB9Ly9pZgogICAgICAgIC8vY291bnQgbm9uIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzCiAgICAgICAgaWYoIWlzYWxudW0oYykpewogICAgICAgIAkgKytzdC5ub25BbG51bUNvdW50OwogICAgICAgIH0vL2lmCgoJCS8vY291bnQgdm93ZWxzIGFuZCBub24gdm93ZWxzLCBhY2NlcHRzIHVwcGVyIGFuZCBsb3dlcmNhc2UKICAgICAgICBpZihpc2FscGhhKGMpKQogICAgICAgIHsKICAgICAgICAgICAgY2hhciBsID0gdG9sb3dlcihjKTsKICAgICAgICAgICAgaWYobD09J2EnfHxsPT0nZSd8fGw9PSdpJ3x8bD09J28nfHxsPT0ndScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICsrc3Qudm93ZWxDb3VudDsKICAgICAgICAgICAgfS8vaWYKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICArK3N0Lm5vblZvd2VsQ291bnQ7CiAgICAgICAgICAgIH0vL2Vsc2UKICAgICAgICB9Ly9pZgoKICAgICAgICAvLyBjb3VudCBzcGVjaWFsIGNoYXJhY3RlcnMKICAgICAgICBpZihpc3B1bmN0KGMpKQogICAgICAgIHsKICAgICAgICAgICAgKytzdC5zcGVjaWFsQ2hhckNvdW50OwogICAgICAgIH0vL2lmCgogICAgICAgIC8vIGNvdW50cyBwcmludGFibGUgYnV0IG5vdCBhbHBoYW51bWVyaWMgYW5kIG5vdCBzcGFjZQogICAgICAgIGlmKGlzcHJpbnQoYykgJiYgIWlzYWxudW0oYykgJiYgIWlzc3BhY2UoYykpCiAgICAgICAgewogICAgICAgICAgICArK3N0LnByaW50YWJsZU5vbkFsbnVtQ291bnQ7CiAgICAgICAgICAgICsrc3QucHVuY3RDb3VudDsKICAgICAgICB9Ly9pZgoJCS8vY291bnQgaGV4IGRpZ2l0cwogICAgICAgIGlmKGlzeGRpZ2l0KGMpKQogICAgICAgIHsKICAgICAgICAJKytzdC5oZXhDb3VudDsKICAgICAgICB9Ly9pZgogICAgICAgIC8vY291bnQgb2N0YWwgZGlnaXRzCiAgICAgICAgaWYoYyA+PSAnMCcgJiYgYyA8PSAnNycpCiAgICAgICAgewogICAgICAgIAkrK3N0Lm9jdGFsQ291bnQ7CiAgICAgICAgfS8vaWYKICAgICAgICAvL2NvdW50IGJpbmFyeSBkaWdpdHMKICAgICAgICBpZihjID09ICcwJyB8fCBjID09ICcxJykKICAgICAgICB7CiAgICAgICAgCSsrc3QuYmluYXJ5Q291bnQ7CiAgICAgICAgfS8vaWYKCQkvL2NvdW50IGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgIGlmKGlzY250cmwoYykpCiAgICAgICAgewogICAgICAgIAkrK3N0LmNvbnRyb2xDb3VudDsKICAgICAgICB9Ly9pZgogICAgICAgIC8vY291bnQgcHJpbnRhYmxlIGNoYXJhY3RlcnMKICAgICAgICBpZihpc3ByaW50KGMpKQogICAgICAgIHsKICAgICAgICAJKytzdC5wcmludGFibGVDb3VudDsKICAgICAgICB9Ly9pZgoKICAgIH0vL2ZvcgoJLy9yZXR1cm4gc3RydWN0dXJlCiAgICByZXR1cm4gc3Q7Cn0=