【问题标题】:How to correctly count a word, newline, and character in C如何正确计算 C 中的单词、换行符和字符
【发布时间】:2015-01-31 21:24:12
【问题描述】:

对于家庭作业,我正在 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 时,我的结果与 wc 的结果相匹配。当我在my_wc.c 上运行我的程序时,问题就来了。

这是wc的结果:

 204     471    4034 my_wc.c

这些是我的结果:

 204    1100    4034 my_wc.c

如您所见,字数统计已经过时了.. 可能是因为在换行时空格被认为是一个单词。但是,当我尝试构建类似有限状态机来检查此类特殊条件时,我的字符数、换行数和字数仍然会出错。

我是否遗漏了什么明显的东西?

【问题讨论】:

  • 您是否考虑了多次出现的空白“单词”仍然只有 1 个单词,但您的算法会出现同样多的单词。
  • 您将每个空白字符都算作一个新词。单词是从非空白字符到空白字符的过渡,因此您需要记住前一个字符是否为空白。
  • 如果我只给你一个字符f,你根本无法判断这是否意味着一个新词已经开始了。您需要存储some context
  • 除了大家说的,你好像忘记了水平的TAB字符。是否应该在行数中包含回车也是有争议的(但这主要是微软操作系统的问题)。

标签: c file word-count


【解决方案1】:

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

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++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2016-08-13
    • 2023-03-12
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多