为何我的C程序统计文本文件单词数的结果不正确?
问题分析与解决方案
你的代码逻辑存在根本问题:只要碰到空白字符就直接给单词数加1,但连续的空白(比如多个换行、空格)会被重复计数,而且没有区分“单词开始/结束”的正确边界。
看你的测试文本:
Hi, we are here. huio klhi
里面的空白字符包括:Hi,后1个空格、we后1个空格、are后1个空格、here.后2个换行、huio后1个空格、klhi后2个换行,总共8个空白字符,所以你的代码输出8,但实际有效单词是Hi,、we、are、here.、huio、klhi,共6个。
修正思路
核心是跟踪是否处于单词中的状态:
- 初始状态设为“不在单词中”
- 遍历每个字符时:
- 如果是空白字符,切换状态为“不在单词中”
- 如果是非空白字符,且之前不在单词中,说明新单词开始,单词数加1,同时切换状态为“在单词中”
修正后的代码
int ch; int in_word = 0; // 0=不在单词中,1=在单词中 int no_of_words = 0; while ((ch = fgetc(fptr)) != EOF) { if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\0') { in_word = 0; } else { if (!in_word) { no_of_words++; in_word = 1; } } }
这段代码只会在新单词开始时计数,连续空白不会重复累加,能正确得到你预期的6个单词结果。
内容的提问来源于stack exchange,提问作者Debbie
相关产品推荐
相关产品推荐

