Hello

I would like to count how many words are in a string

ie "PETER JOHNSON LTD"

so this string contains 3

I was going to use strtok but this is too slow.

Any other ideas?

Go over the string and count spaces. The number of words is one more than the number of spaces in the string if the string isn't empty.

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

int main( void ) {
  char string[100];
  int i;
  int count = 0;

  printf( "Enter a sentence> " );
  fgets( string, 100, stdin );
  string[strlen( string ) - 1] = '\0';

  /* count the words */
  for ( i = 0; string[i]; ++i ) {
    if ( isspace( string[i] ) ) {
      ++count;
    }
  }

  if ( i > 0 ) {
    ++count;
  }

  printf( "\"%s\" has %d words\n", string, count );

  return 0;
}

>>Go over the string and count spaces
Generally, yes, but you also have to check if words are separated by more than one white space (spaces or tabs). When a white space character is encountered you have to increment the loop counter until the first non-white space character or end-of-string is found before continuing the loop. If you don't, the word count might be wrong.

Try something like this. It would work for any kind of whitespaces (newline, spaces, tabs).

int main(void)
{
    char str[] = " hello \n   to all \n\r\f the \t people ";
    int limit = strlen(str);
    int i, change = 1, words = 0;
    for(i = 0; i < limit; ++i)
    {
        if(!isspace(str[i]))
        {
            if(change)
            {
                ++words;
                change = 0;
            }
        }
        else
        {
            change = 1;
        }
    }
    printf("Word count: %d\n", words);
    getchar();
    return(0);
}

I'd use strtok(). If it is slower, it isn't much slower. It is also neater, seeing as how it won't take as many lines of code and variables.

Here's mine

int wordCount( char *line )
{
  int count = 0 ;
  
  // advance until the first nonwhitespace character
  while( isspace( *line ) )  line++ ;

  int len = strlen( line ) ;
  bool onWord = true ;
  
  for( int i = 0 ; i < len; i++ )
  {
    if( isspace( line[i] ) )
    {
      // INcrement count only when
      // stepping OFF word to whitespace
      if( onWord )
        count++ ;
      onWord = false ;
    }
    else
    {
      onWord = true ;
    }

  }

  // If you ended while still on word
  // then increment count here to count
  // the "last" word
  if( onWord )
    count++ ;

  return count ;

}

int main()
{
  char *line1 = "a line of words" ;
  char *line2 = "Hi ther e     !!  Each glob of    characters\n"
  "counts as a     word \t \t \t \n" ;
  char *line3 = "Here's   another long    line of 3 4 6 6  8 " ;

  printf( "%d words in `%s`\n\n", wordCount(line1), line1 ) ;
  printf( "%d words in `%s`\n\n", wordCount(line2), line2 ) ;
  printf( "%d words in `%s`\n\n", wordCount(line3), line3 ) ;
}
#include<stdio.h>

int main()
{

   char name[20];
   int i, j, count = 0, end = 0, line = 0, word = 0, flag = 0; 
   printf ( "Enter the strings\n" );
   gets ( name ); 

   for ( i = 0; name[i] != '\0'; i++ )
   {
      if ( name[i] == ' ' || name[i] == '\t' )
         printf ( " " );
      count++;

      if ( name[i] == '\0' )
         end = 0;
      else if ( end == 0 )
      {
         end = 1;
         line++;
      }
      if ( name[i] == ' ' || name[i] == '\t' || name[i] == '\n' )
         flag = 0;
      else if ( flag == 0 )
      {
         flag = 1;
         word++;
      }

   } 

   printf ( "Total number of characters %d\n", count );

   printf ( "Total number of word %d\n", word );

   printf ( "Total number of line %d\n", line );

}

Edited 6 Years Ago by __avd: Added [code] tags. For easy readability, always wrap programming code within posts in [code] (code blocks).

Comments
Yuck and not even what the OP wanted almost 3 years ago.
This article has been dead for over six months. Start a new discussion instead.