【发布时间】: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