单词计数结果少1的原因及合理解决方法咨询
单词计数少1的问题解决
问题说明
输入文本「One fish. Two fish. Red fish. Blue fish.」时,字母计数(29个)、句子计数(4句)都正确,但单词计数显示7个,实际应该是8个。问题出在count_words函数里:它只统计空格的数量,而最后一个单词末尾没有空格,所以空格数比单词数少1,直接返回空格数自然就少算了一个单词。
现有代码的问题
当前的单词计数函数逻辑是统计空格数,然后直接返回这个数值:
int count_words(string sample) { int counter = 0; int len = strlen(sample); for (int i = 0; i < len; i++) { if (isblank(sample[i])) { counter++; } } return counter; }
正常情况下,单词数 = 空格数 + 1(比如8个单词对应7个空格),所以直接返回空格数肯定会少1。
两种解决办法
办法1:把计数器初始值设为1(简单但要处理空输入)
如果输入的文本不是空的,直接把counter初始值设为1,再统计空格数,最后返回counter。但要额外处理空输入或者全是空格的情况,避免错误计数:
int count_words(string sample) { int len = strlen(sample); // 空输入或全空格直接返回0 if (len == 0) { return 0; } int counter = 1; for (int i = 0; i < len; i++) { if (isblank(sample[i])) { counter++; } } return counter; }
不过这个办法有缺陷:如果文本开头、结尾有连续空格,或者中间有多个空格,会多算单词数。比如输入「 Hello world 」,会统计3个空格,返回4,但实际只有2个单词。
办法2:统计单词的起始位置(更严谨,适配所有情况)
换个思路:遍历每个字符,当遇到不是空格的字符,并且它的前一个字符是空格(或者它是第一个字符且不是空格)时,就把计数器加1。这样能自动过滤开头/结尾的空格、连续空格的情况:
int count_words(string sample) { int counter = 0; int len = strlen(sample); for (int i = 0; i < len; i++) { // 当前字符非空格,且是单词的第一个字符(要么是文本开头,要么前一个是空格) if (!isblank(sample[i]) && (i == 0 || isblank(sample[i-1]))) { counter++; } } return counter; }
这个逻辑能处理所有边界情况:
- 空文本:返回0
- 开头/结尾有空格:不会误计数
- 多个连续空格:只会在单词开头触发一次计数
测试验证
用你提供的测试文本「One fish. Two fish. Red fish. Blue fish.」测试:
- 办法1:初始counter=1,统计到7个空格,返回8,正确
- 办法2:会在每个单词的第一个字符(O、f、T、f、R、f、B、f)处触发计数,总共8次,返回8,正确
内容的提问来源于stack exchange,提问作者areh1819
相关产品推荐
相关产品推荐

