计算具有多个空格的单词数

时间:2014-03-07 09:50:53

标签: c string character whitespace

我正在尝试编写一个打印文本文件中找到的单词数的程序。单词被定义为由任意数量的空格分隔的字符序列。

但是,当有多个空格时我遇到了问题,因为它没有报告正确的单词数。

到目前为止,这是我的代码:

#include <stdio.h>

int main()
{
   FILE *fp;
   char str;
   int i=0;

   /* opening file for reading */
   fp = fopen("myfile.txt" , "r");
   if(fp == NULL) {
      perror("Error opening file");
      return(-1);
   }
   while(( str = fgetc(fp)) != EOF ) {
     if (str == ' ')
             ++i;
   }

   printf("%d\n", i);
   fclose(fp);

   return(0);
}

myfile.txt是:

Let's do this!      You can do it. Believe in yourself.

我不确定我是否使用fgets,fscanf或fgetc。

假设我在读取字符串时在fscanf函数中定义了空格

它打印14不对。我不知道如何考虑多个空格。在这种情况下,空格是单词之间的任意数量的空格。

4 个答案:

答案 0 :(得分:1)

只有在没有任何其他空格的情况下计算空格才能完成。

#include <stdio.h>

int main()
{
   FILE *fp;
   char str;
   char prevchar; //tracks the previous character
   int i=0;

   /* opening file for reading */
   fp = fopen("myfile.txt" , "r");
   if(fp == NULL) {
      perror("Error opening file");
      return(-1);
   }
   prevchar='x'; //initialize prevchar to anything except a space
   while(( str = fgetc(fp)) != EOF ) {
     if (str == ' ' && prevchar!=' ') // update the count only if previous character encountered was not a space
             ++i;
   prevchar=str;
   }

   printf("%d\n", i+1);
   fclose(fp);

   return(0);
}

编辑:代码假定单词由一个或多个空格分隔,并且不包括所有的边角情况,例如当句子分布在多行上或者单词用逗号而不是空格分隔时。但是可以通过添加更多条件来涵盖这些情况。

答案 1 :(得分:1)

只需使用一个小状态图,有两种情况,或者你在一个单词中,或者你在一个单词之外

#include <stdio.h>

int main()
{
FILE *fp;
char str;
int i=0,inside_word =0;

/* opening file for reading */
fp = fopen("myfile.txt" , "r");
if(fp == NULL) {
    perror("Error opening file");
    return(-1);
}
inside_word =0;
while(( str = fgetc(fp)) != EOF ) {
    if (str == ' ' || str == '\n' || str == '\t')
        inside_word = 0;
    else if(inside_word == 0){
        i++;
        inside_word=1;
    }
}

printf("%d\n", i);
fclose(fp);

return(0);
}

答案 2 :(得分:0)

首先我想到的是,在++ i之后添加另一个while循环以消耗空格字符。

顺便说一句,要小心你的术语,你不是在处理你只是在处理太空人物的空白。 \ t和\ n也是空格!

答案 3 :(得分:-1)

如何使用正则表达式,例如'!\ s +!'替换为单个空格'',然后继续使用您的代码