c - 如何正确计算 C 中的单词、换行符和字符

标签 c file word-count

为了完成家庭作业,我正在 Linux 上实现 wc 的递归版本。其格式如下所示:

new_line_count word_count character_count file_name

我在遍历和从目录中抓取每个文件时没有遇到问题,也没有在实际读取文件时遇到任何问题。当尝试正确计算单词、字符和换行符时,我的问题就出现了。

为了计算这些内容,我创建了三个全局变量(在读取整个文件后重置),然后使用 switch 语句来计算所有内容:

#define SPACE 32
#define NEW_LINE 10
#define VERT_TAB 11
#define C_RETURN 13

unsigned int new_line = 0;
unsigned int word_count = 0;
unsigned int char_count = 0;

void check_wc(int i, char *file_name)
{
    switch(i)
    {
        case SPACE:
            char_count++;
            word_count++;
            break;
        case NEW_LINE:
        case VERT_TAB:
        case C_RETURN:
            char_count++;
            word_count++;
            new_line++;
            break;
        default:
            char_count++;
    }
}

在简单文本文件上运行时,我的结果与 wc 的结果相匹配。当我在 my_wc.c 上运行程序时,问题就出现了。

这是wc的结果:

 204     471    4034 my_wc.c

这些是我的结果:

 204    1100    4034 my_wc.c

正如您所看到的,字数统计远远不够......可能是因为在换行时空格被视为一个单词。然而,当我尝试构建类似有限状态机之类的东西来检查此类特殊条件时,我的字符计数、换行符计数和字数计数仍然错误。

我遗漏了一些明显的东西吗?

最佳答案

正如其他人所说,您需要跟踪您是否在单词内:

characters = 0
words = 0
newlines = 0
in_word = false

foreach character c in file
  characters++

  if c == '\n'
    newlines++

  if isspace (c) // includes newlines
    in_word = false
  else
    if (!in_word)
      in_word = true
      words++

关于c - 如何正确计算 C 中的单词、换行符和字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28226470/

相关文章:

c - 将二进制文件写入文件会从 C 中先前不相关的 popen 命令中提取不正确的数据

perl - 如何将变量和文件传递给 perl -p -e 命令

c++ - 从标准输出(C++)获取信息?

c++ - 读取文本文件并在 C++ 中按行返回字数

java - 计算字符串数组中每个单词最后一次出现后的单词数

c - 函数的返回值== 0?

c++ - C++11 中具有 C 链接的复杂类型

C++ 类成员函数到 C 结构函数指针

c++ - 在只知道 FILE * 的 C++ 中清除文件内容

java - 运行hadoop wordcount示例时出现错误消息