You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单词计数结果少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:03:32