the program i've written counts the number of words in a string entered from the keyboard (it works).
if someone could, please tell me if there is a better way to do it or how i can improve my code.
Code:/* header: # of words notes: this program counts the number of words in a string. - a word is a sequence of consecutive letters */ #include <stdio.h> #include <string.h> int nwords(int, char []); int ctest(char, int); int main() { char line[100]; // get string printf("Enter a string: "); fgets(line, sizeof(line), stdin); // get number of words printf("number of words is %d", nwords(strlen(line)-1, line)); while (getchar() != '\n') ; return 0; } /* name: words counter parameters: length = length of string, line[] = string array return: the number of words in string note: character excludes tab, space, return, and null */ int nwords(int length, char line[]) { int x = 0; // position of character in string- starts from 0 int fchar; // position of first character int lchar; // position of last character int letters = 0; // number of letters in sequence from fchar to lchar int words = 0; // number of words counter /* in line if position of last consecutive character minus position of first character plus 1 equals the number of letters in sequence the sequence of characters is a word. example : what happens : word hello : fchar = 0; lchar = 4; letters = 5; lchar-fchar+1=letters yes yes : fchar = 1; lchar = 3; letters = 3; lchar-fchar+1=letters yes hello yes : fchar = 0; lchar = 4; letters = 5; lchar-fchar+1=letters yes fchar = 6; lchar = 8; letters = 3; lchar-fchar+1=letters yes */ for ( x; x < length; ++x) { if ( ctest(line[x], 3) ) { // if it isn't a tab, space, return key and NULL fchar = x; // sets position of "first character" if ( ctest(line[x], 1) ) ++letters; // if it is a letter, letter increments for ( x+1; x < length; ++x) { // checks string after the "first character" if ( ctest(line[x+1], 2) ) { // if it is a tab, space, return key or NULL, sets position of "last character" and break out of loop lchar = x; } else if ( ctest(line[x+1], 1) ) { // if it is a letter, letter increments and goes to top ++letters; continue; } else continue; break; } } if (lchar-fchar + 1 == letters) ++words; // if it is a word, word increments letters = 0; // reset letter to zero - important } return (words); } /* name: character test parameters: character = a character, consider = a number (1-3) return: zero or 1 */ int ctest(char character, int consider) { switch (consider) { case 1: // if it is a character if ((character >= 'a' && character <='z') || (character >= 'A' && character <='Z')) return 1; break; case 2: // if it is a tab, space, return key or NULL if (character == '\t' || character == ' ' || character == '\n' || character == '\0') return 1; break; case 3: // if it isn't a tab, space, return key and NULL if (character != '\t' && character != ' ' && character != '\n' && character != '\0') return 1; break; } return 0; }



LinkBack URL
About LinkBacks


