【问题标题】:Counting number of words with multiple whitespaces计算具有多个空格的单词数
【发布时间】:2014-04-10 09:38:15
【问题描述】:

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

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

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

#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 这是不正确的。我不确定如何考虑多个空格。在这种情况下,空格是单词之间的任意数量的空格。

【问题讨论】:

  • 这是一个类似的问题和关于如何在 C 中修剪空格的答案。stackoverflow.com/questions/122616/…
  • isspace() in &lt;stdlib.h&gt; 将检测任何空格,而不仅仅是空格。
  • 您可以在循环中使用 fscanf,但这意味着将单词保存在数组中。
  • @KlasLindbäck isspace() in &lt;ctype.h&gt;
  • @BLUEPIXY 你是对的。我一定是用有缺陷的信息访问了一个网站。下次我会使用man 而不是一个糟糕的网络搜索引擎来查找它。

标签: c string character whitespace


【解决方案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);
}

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

【讨论】:

  • 不幸的是,当我在另一行添加文本时,这不起作用。编辑:只需阅读您的评论。我将实施什么来计算另一个空间
  • 当然,这段代码并没有涵盖很多极端情况。但这里的要点是,您可以通过添加更多条件来实现它们。
【解决方案2】:

只是用一个小状态图,两种情况,要么你在一个词内,要么你在一个词外

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

【讨论】:

    【解决方案3】:

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

    顺便说一句,请注意您的术语,您不是在处理空格,而是在处理空格字符。 \t 和 \n 也是空格!

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这是我得到的警告:常量 561195809 与 'char' 类型表达式的比较总是错误的 [-Wtautological-constant-out-of-range-compare]
      • @XiJiaopin 你能分享给出这个警告的代码吗?
      • @XiJiaopin,我偶然发现了一个符合您确切要求的MSDN 示例。但是,代码是用 C++ 编写的。我认为它可能仍然有帮助。
      • @XiJiaopin,我不得不猜测你上面提到的警告。正则表达式匹配的结果可能会产生类似 REG_NOMATCH 的常量,您可以在 if 条件中将其视为布尔值。因此发出警告。希望这会有所帮助
      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多