Read in string and evaluate for word count and letter occurrences

LANGUAGE: C++

CHALLENGE:

Write a program that will read in a line of text and output the number of words in the line and the number of occurrences of each letter. Define a word to be any string of letters that is delimited at each end by either a whitespace, a period, a comma, or the beginning or end of the line.

SOLUTION:



#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int CountWords(string strString);
char add_letter( char letter, int counters[] );

int main(){
	std::string input;
	int counters[26] = { 0 };

	//request String
	cout << "Please enter a sentence.\n";
	getline(cin, input);

	//Display Word Count
	cout << "\n" << CountWords(input) <<  " Words" << endl;

	char *sentence=new char[input.size()+1];
	sentence[input.size()]=0;
	memcpy(sentence,input.c_str(),input.size());

	//Count Letters
	while ( add_letter(*sentence++, counters) );

	//Display Letter Results
	for (int i = 0; i < 26; ++i) {
		if ( counters[i] ) {
			cout << counters[i] << ": " << char(i + 'a') << '\n';
		}
	}

	cout << "\nPress enter to exit. ";
	cin.get();
	return 0;
}

int CountWords(string strString){
	int nSpaces = 0;
	unsigned int i = 0;

	while(isspace(strString.at(i)))
		i++;

		for(; i < strString.length(); i++){
			if(isspace(strString.at(i))){
				nSpaces++;

				while(isspace(strString.at(i++))){
					if(strString.at(i) == '\0'){
						nSpaces--;
					}
				}
			}
		}

	return nSpaces + 1;
}

char add_letter( char letter, int counters[] ) {
	char lower_case_letter = tolower(letter);
	if ( lower_case_letter >= 'a' && lower_case_letter <= 'z' ) {
		++counters[ lower_case_letter - 'a' ];
	}
	return letter;
}