0

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?

10
Contributors
11
Replies
14
Views
10 Years
Discussion Span
Last Post by jephthah
Featured Replies
0

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;
}
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.

0

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);
}
-1

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.

-2

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 ) ;
}
-1
#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 by __avd: Added [code] tags. For easy readability, always wrap programming code within posts in [code] (code blocks).

Votes + Comments
Yuck and not even what the OP wanted almost 3 years ago.
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.