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

如何统计数组中首个单词的出现次数?(C语言一维数组,禁用strtok)

问题分析与修复

原代码的核心错误

  • 统计逻辑完全错误:原内层循环试图用d = k匹配distArr[d],但distArr长度是首个单词的长度,当k大于等于该长度时循环根本不会执行;且逐个字符匹配就累加count的逻辑,统计的是匹配字符数而非单词出现次数。
  • 未处理单词匹配后的跳转:匹配完一个单词后,未跳过当前单词的剩余字符,会导致重复检查同一单词的后续字符。
  • 重复调用strlen:循环中反复调用strlen会频繁计算字符串长度,降低效率。

修复后的代码

#include <stdio.h>
#include <string.h>

int main(void)
{
    char finalArr[100];
    char src;
    int i = 0;

    printf("Enter a string: ");
    // 读取输入字符串
    while ((src = getchar()) != '\n' && i < 99)
    {
        finalArr[i] = src;
        i++;
    }
    finalArr[i] = '\0';
    printf("Input string: %s\n", finalArr);

    // 提取首个单词到distArr
    char distArr[100];
    int j = 0;
    // 遍历到空格或字符串结尾,提取首个单词
    while (j < strlen(finalArr) && finalArr[j] != ' ')
    {
        distArr[j] = finalArr[j];
        j++;
    }
    distArr[j] = '\0';
    int len_dist = strlen(distArr);
    // 如果首个单词为空(输入全是空格),直接输出0
    if (len_dist == 0)
    {
        printf("Count: 0\n");
        return 0;
    }
    printf("First word: %s\n", distArr);

    // 统计首个单词的出现次数
    int count = 0;
    int len_final = strlen(finalArr);
    int k = 0;

    while (k < len_final)
    {
        // 跳过前面的空格
        while (k < len_final && finalArr[k] == ' ')
        {
            k++;
        }
        // 到达字符串结尾,退出循环
        if (k >= len_final)
        {
            break;
        }

        // 检查当前位置是否匹配首个单词
        int match = 1;
        for (int d = 0; d < len_dist; d++)
        {
            // 如果字符不匹配,或者当前位置已经到字符串结尾,标记不匹配
            if (k + d >= len_final || finalArr[k + d] != distArr[d])
            {
                match = 0;
                break;
            }
        }

        // 如果匹配成功,计数加1,并且跳过当前单词的长度
        if (match)
        {
            count++;
            k += len_dist;
        }
        else
        {
            // 不匹配的话,只跳过当前字符,继续检查下一个位置
            k++;
        }
    }

    printf("Count: %d\n", count);
    return 0;
}

关键修复点说明

  1. 首个单词提取优化:改用while循环更清晰,同时处理输入只有单个单词的情况。
  2. 提前存储字符串长度:将strlen结果存入变量len_final和len_dist,避免循环内重复计算。
  3. 正确的匹配逻辑:
    • 先跳过当前位置的所有空格,定位单词起始点。
    • 从起始点开始逐个字符比对首个单词,只有全匹配才算一次有效出现。
    • 匹配成功后直接跳过整个单词长度,避免重复检查;匹配失败则移动一个字符继续寻找。
  4. 边界处理:增加空单词(输入全是空格)的判断,避免无效计算。

测试输入qwe qwe qwe时,输出结果为3,符合预期。

内容的提问来源于stack exchange,提问作者eliazz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:20:34