Counting words in a string - c programming
Asked Answered
R

15

7

I need to write a function that will count words in a string. For the purpose of this assignment, a "word" is defined to be a sequence of non-null, non-whitespace characters, separated from other words by whitespace.

This is what I have so far:

int words(const char sentence[]);

int i, length = 0, count = 0, last = 0;
length = strlen(sentence);

for (i = 0, i < length, i++)
    if (sentence[i] != ' ')
        if (last=0)
            count++;
        else
            last = 1;
    else
        last = 0;
 
return count;

I am not sure if it works or not because I can't test it until my whole program is finished and I am not sure it will work, is there a better way of writing this function?

Riproaring answered 2/10, 2012 at 21:44 Comment(3)
The homework tag is deprecated. Please don't use it. As to your question, my first thought was strtok, as separating things is what it's meant to do. Anyway, if (sentence[i] >= '!' && sentence[i] >= '~') has something a bit incorrect beyond just relying on ASCII to be used.Smelser
what's the point of ! and ~? Everything what's not whitespace is part of a word.Sorites
tab & newline are whitespace.Sorites
F
7

You needed

int words(const char sentence[])
{
}

(note braces).

For loops go with ; instead of ,.


Without any disclaimer, here's what I'd have written:

See it live http://ideone.com/uNgPL

#include <string.h>
#include <stdio.h>

int words(const char sentence[ ])
{
    int counted = 0; // result

    // state:
    const char* it = sentence;
    int inword = 0;

    do switch(*it) {
        case '\0': 
        case ' ': case '\t': case '\n': case '\r': // TODO others?
            if (inword) { inword = 0; counted++; }
            break;
        default: inword = 1;
    } while(*it++);

    return counted;
}

int main(int argc, const char *argv[])
{
    printf("%d\n", words(""));
    printf("%d\n", words("\t"));
    printf("%d\n", words("   a      castle     "));
    printf("%d\n", words("my world is a castle"));
}
Fridge answered 2/10, 2012 at 22:11 Comment(0)
S
4

See the following example, you can follow the approach : count the whitespace between words .

int words(const char *sentence)
{
    int count=0,i,len;
    char lastC;
    len=strlen(sentence);
    if(len > 0)
    {
        lastC = sentence[0];
    }
    for(i=0; i<=len; i++)
    {
        if((sentence[i]==' ' || sentence[i]=='\0') && lastC != ' ')
        {
            count++;
        }
        lastC = sentence[i];
    }
    return count;
}

To test :

int main() 
{ 
    char str[30] = "a posse ad esse";
    printf("Words = %i\n", words(str));
}

Output :

Words = 4
Sneer answered 2/10, 2012 at 22:3 Comment(3)
Hey @Sneer thank you. The problem with that is that if there is a space in the beginning of the sentence it will count 5Riproaring
@Riproaring see the update of my answer it is fixed now, i know it is not perfect but it could be a good starting point ...Sneer
@Sneer "count" should be initialized with zero. Your current code gives error because count is not initialized with zero so it can't be incremented.Analgesic
S
3
#include <ctype.h> // isspace()

int
nwords(const char *s) {
  if (!s) return -1;

  int n = 0;
  int inword = 0;
  for ( ; *s; ++s) {
    if (!isspace(*s)) {
      if (inword == 0) { // begin word
        inword = 1;
        ++n;
      }
    }
    else if (inword) { // end word
      inword = 0;
    }
  }
  return n;
}
Saba answered 2/10, 2012 at 22:21 Comment(0)
S
1
bool isWhiteSpace( char c )
{
    if( c == ' ' || c == '\t' || c == '\n' )
        return true;
    return false;
}

int wordCount( char *string )
{
    char *s = string;
    bool inWord = false;
    int i = 0;

    while( *s )
    {
        if( isWhiteSpace(*s))
        {
            inWord = false;
            while( isWhiteSpace(*s) )
                s++;
        }
        else
        {
            if( !inWord )
            {
                inWord = true;
                i++;
            }
            s++;
        }
    }

    return i;
}
Starling answered 19/3, 2015 at 14:23 Comment(0)
H
1

Here is one of the solutions. It counts words with multiple spaces or just space or space followed by the word.

#include <stdio.h>
int main()
{
    char str[80];
    int i, w = 0;
    printf("Enter a string: ");
    scanf("%[^\n]",str);

    for (i = 0; str[i] != '\0'; i++)
    {
       
        if((str[i]!=' ' && str[i+1]==' ')||(str[i+1]=='\0' && str[i]!=' '))
        {
            w++;
        }
        
    }

    printf("The number of words = %d", w );

    return 0;
}
Heterogenous answered 31/1, 2021 at 16:47 Comment(0)
S
1

I know this is an old thread, but perhaps someone needs a simple solution, just checks for blank space in ascii and compares current char to that while also makign sure first char is not a space, cheers!

int count_words(string text){
int counter = 1;
int len = strlen(text);
for(int i = 0; i < len; i++){
    if(text[i] == 32 && i != 0) {
        counter++;
    }
}
return counter;}
Simeon answered 27/6, 2022 at 10:42 Comment(1)
This answer is nearly identical to one by marihan sherif. You should edit that one or comment on it with your modifications.Amatruda
G
0

Here is another solution:

#include <string.h>

int words(const char *s)
{
    const char *sep = " \t\n\r\v\f";
    int word = 0;
    size_t len;

    s += strspn(s, sep);

    while ((len = strcspn(s, sep)) > 0) {
        ++word;
        s += len;
        s += strspn(s, sep);
    }
    return word;
}
Gleiwitz answered 23/10, 2012 at 21:26 Comment(0)
P
0
#include<stdio.h>

int main()   
{    
char str[50];    
int i, count=1;  
printf("Enter a string:\n");    
gets(str);    
for (i=0; str[i]!='\0'; i++)   
        {
        if(str[i]==' ')    
                {
                count++;
                }
        }
printf("%i\n",count);    
}
Pedropedrotti answered 18/3, 2014 at 10:16 Comment(0)
B
0
#include<stdio.h>
#include<string.h>

int getN(char *);


int main(){
    char str[999];
    printf("Enter Sentence: "); gets(str);
    printf("there are %d words", getN(str));
}


int getN(char *str){
    int i = 0, len, count= 0;
    len = strlen(str);
    if(str[i] >= 'A' && str[i] <= 'z')
       count ++;


    for (i = 1; i<len; i++)
        if((str[i]==' ' || str[i]=='\t' || str[i]=='\n')&& str[i+1] >= 'A' && str[i+1] <= 'z')
        count++;


return count;
}
Brick answered 18/4, 2015 at 0:55 Comment(0)
S
0
#include <stdio.h>

int wordcount (char *string){

    int n = 0; 

    char *p = string ;
    int flag = 0 ;

    while(isspace(*p)) p++;


    while(*p){
        if(!isspace(*p)){
            if(flag == 0){
                flag = 1 ;
                n++;
            }
        }
        else flag = 0;
        p++;
    }

    return n ;
}


int main(int argc, char **argv){

    printf("%d\n" , wordcount("    hello  world\nNo matter how many newline and spaces"));
    return 1 ;
}
Shitty answered 4/8, 2015 at 15:46 Comment(0)
B
0

I found the posted question after finishing my function for a C class I'm taking. I saw some good ideas from code people have posted above. Here's what I had come up with for an answer. It certainly is not as concise as other's, but it does work. Maybe this will help someone in the future.

My function receives an array of chars in. I then set a pointer to the array to speed up the function if it was scaled up. Next I found the length of the string to loop over. I then use the length of the string as the max for the 'for' loop. I then check the pointer which is looking at array[0] to see if it is a valid character or punctuation. If pointer is valid then increment to next array index. The word counter is incremented when the first two tests fail. The function then will increment over any number of spaces until the next valid char is found. The function ends when null '\0' or a new line '\n' character is found. Function will increment count one last time right before it exit to account for the word preceding null or newline. Function returns count to the calling function.

#include <ctype.h>

char wordCount(char array[]) {
    char *pointer;    //Declare pointer type char
    pointer = &array[0];  //Pointer to array

    int count; //Holder for word count
    count = 0; //Initialize to 0.

    long len;  //Holder for length of passed sentence
    len = strlen(array);  //Set len to length of string

    for (int i = 0; i < len; i++){

        //Is char punctuation?
        if (ispunct(*(pointer)) == 1) {
            pointer += 1;
            continue;
        }
        //Is the char a valid character?
        if (isalpha(*(pointer)) == 1) {
            pointer += 1;
            continue;
        }
        //Not a valid char.  Increment counter.
        count++;

        //Look out for those empty spaces. Don't count previous
        //word until hitting the end of the spaces.
        if (*(pointer) == ' ') {
            do {
                pointer += 1;
            } while (*(pointer) == ' ');
        }

        //Important, check for end of the string
        //or newline characters.
        if (*pointer == '\0' || *pointer == '\n') {
            count++;
            return(count);
        }
    }
    //Redundent return statement.
    count++;
    return(count);
}
Banjermasin answered 7/11, 2017 at 20:9 Comment(0)
C
0

I had this as an assignment...so i know this works. The function gives you the number of words, average word length, number of lines and number of characters. To count words, you have to use isspace() to check for whitespaces. if isspace is 0 you know you're not reading whitespace. wordCounter is a just a way to keep track of consecutive letters. Once you get to a whitespace, you reset that counter and increment wordCount. My code below:

Use isspace(c) to

#include <stdio.h>
#include <ctype.h>

int main() {
  int lineCount = 0;
  double wordCount = 0;
  double avgWordLength = 0;
  int numLines = 0;
  int wordCounter = 0;
  double nonSpaceChars = 0;
  int numChars = 0;
  printf("Please enter text.  Use an empty line to stop.\n"); 
  while (1) {
      int ic = getchar();
      if (ic < 0)    //EOF encountered
          break;
      char c = (char) ic;
      if (isspace(c) == 0 ){
      wordCounter++;
      nonSpaceChars++;
    }
      if (isspace(c) && wordCounter > 0){
      wordCount++;
      wordCounter =0;
    }
      if (c == '\n' && lineCount == 0) //Empty line
      { 
          break; 
      }
      numChars ++;
      if (c == '\n') {
          numLines ++;
          lineCount = 0;
      }
      else{
          lineCount ++;
    }
  }
  avgWordLength = nonSpaceChars/wordCount;
  printf("%f\n", nonSpaceChars);
  printf("Your text has %d characters and %d lines.\nYour text has %f words, with an average length of %3.2f ", numChars, numLines, wordCount, avgWordLength);
}
Canescent answered 24/1, 2019 at 21:58 Comment(0)
P
-1

Here is one solution. This one will count words correctly even if there are multiple spaces between words, no spaces around interpuncion symbols, etc. For example: I am,My mother is. Elephants ,fly away.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int countWords(char*);


int main() {
    char string[1000];
    int wordsNum;

    printf("Unesi nisku: ");
    gets(string);  /*dont use this function lightly*/

    wordsNum = countWords(string);

    printf("Broj reci: %d\n", wordsNum);

    return EXIT_SUCCESS;
}


int countWords(char string[]) {
    int inWord = 0,
        n,
        i,
        nOfWords = 0;

    n = strlen(string);

    for (i = 0; i <= n; i++) {
        if (isalnum(string[i]))
            inWord = 1;
        else
            if (inWord) {
                inWord = 0;
                nOfWords++;
            }
    }

    return nOfWords;
}
Ptyalin answered 2/9, 2013 at 20:57 Comment(1)
"dont use this function lightly"? You probably meant "don't use this function at all".Chandra
Q
-1

this is a simpler function to calculate the number of words

int counter_words(char* a){`

 // go through chars in a
 // if ' ' new word
 int words=1;
 int i;
 for(i=0;i<strlen(a);++i)
 {
      if(a[i]==' ' && a[i+1] !=0)
      {
           ++words;
      }
 }

return words;}

Quach answered 8/7, 2016 at 9:14 Comment(0)
G
-1

Code for counting words will return the number of words:

for (int i = 0; i < len; i++)
{

     if (sentence[i] == ' ' && sentence[i + 1] != ' ' && sentence[i+1] != ' ') 
          counter++;              

     else if(sentence[i] == '\n' && sentence[i-1] != ' ') counter++;
     
}
Gosnell answered 8/8 at 5:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.