【问题标题】:C - How to count words in a txt file?C - 如何计算txt文件中的单词?
【发布时间】:2014-01-25 23:19:48
【问题描述】:

所以我应该计算一个多行的txt文件中有多少单词,单词被定义为连续的字母序列(a到z,A到Z)和由任何字符分隔的撇号在这些范围之外。

我有我认为正确的内容,但字数总是出错。有人看到我的代码有什么奇怪的地方吗?

请忽略行数和字符数,因为它们工作正常。我尝试计算单词之间的空格,其中 32 是空格的 ASCII 码。

#include <stdio.h>

int main()
{
int c;
int charcount = 0;
int wordcount = 1;
int linecount = 0;

while (c != EOF)
{
    c = getchar();
    if (c == EOF)
        break;
    if (c == 10)
        linecount++;

    charcount++;

    if (c == 32)
        wordcount++;

}

printf ("%d %d %d\n", charcount, wordcount, linecount);
return 0;

}

例如,其中一个 txt 文件说:

Said Hamlet to Ophelia,
I'll draw a sketch of thee,
What kind of pencil shall I use?
2B or not 2B?

这里的字数是 21,但我得到的字数是 18。我尝试计算 "/n" 的数量,它适用于本次测试,但在下一次测试中失败。

提前致谢!

【问题讨论】:

  • 在您的代码中,只有空格字符会增加单词的数量,因此不计算行尾的单词。
  • wordcount = 空白字符数 + 1。(如果你的文件以换行符结尾,甚至不需要加 1)。
  • 您应该在调试器中单步执行并弄清楚。此站点不是调试服务。
  • 顺便说一句,不要使用 10 和 32 作为硬字符代码。 C 不强制要求 ASCII/UTF-8,更糟糕的是,它们很难阅读。此外,while (c != EOF) 是多余的,它可能只是while (1)。或者while ((c = getchar()) != EOF),如果你想打扰可读性怪胎(比如我)。
  • @H2CO3 没那么容易。如果您有 2,3 等连续空格,您仍然可以计算字数

标签: c


【解决方案1】:

包含ctype.h然后修改

if (c == 32)
    wordcount++

if (isspace(c))
    wordcount++

单词由空格、制表符和行字符分隔。

【讨论】:

    【解决方案2】:

    使用用 C 编码的简单 FSM:

    #include <stdio.h>
    #include <ctype.h>
    
    enum {INITIAL,WORD,SPACE};
    
    int main()
    {
      int c;
      int state = INITIAL;
      int wcount = 0;
    
      c = getchar();
      while (c != EOF)
      {
        switch (state)
        {
          case INITIAL: wcount = 0;
                        if (isalpha(c) || c=='\'')
                        {
                           wcount++;
                           state = WORD;
                        }
                        else
                           state = SPACE;
                        break;
    
          case WORD:    if (!isalpha(c) && c!='\'')
                           state = SPACE;
                        break;
    
          case SPACE:   if (isalpha(c) || c=='\'')
                        {
                           wcount++;
                           state = WORD;
                        }
        }
        c = getchar();
      }
      printf ("%d words\n", wcount);
      return 0;
    }
    

    【讨论】:

    • 哇,这是高级哈哈。但是非常感谢!我现在知道我的代码哪里出了问题。
    • isalpha -> isalnum,如果(OP 的问题)一个数字也是一个词。它适用于该示例,因为 2B 至少包含一个字母,但不考虑数字并且不会将状态更改为有用的东西。
    • 根据他的问题,数字不是单词的一部分:“单词被定义为字母(a 到 z,A 到 Z)和撇号的连续序列”
    • @Jongware:数字被认为是分隔符,所以读取时状态变为SPACE
    • 顺便说一句:为什么是负面的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2021-06-25
    • 1970-01-01
    • 2015-06-14
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多