为了完成家庭作业,我正在 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/