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

关于strstr()的技术问题:统计子串在母串中的出现次数

用strstr()统计子串出现次数的正确循环实现

嗨,我来帮你搞定这个问题!其实核心就是每次找到子串后,要调整下一次查找的起始位置,避免重复统计或者陷入死循环,下面给你详细拆解:

核心思路

每次调用strstr()找到子串后,不能停留在当前匹配的起始位置继续查找——否则会一直匹配同一个子串(比如子串是"a",母串是"aaa",不移动的话会无限循环)。我们需要根据需求选择两种移动方式:

  • 不重叠统计:从匹配到的子串末尾的下一个字符开始下一轮查找(比如母串"abcabcabc"找"abc",结果是3次)
  • 重叠统计:从匹配位置的下一个字符开始查找(比如母串"aaa"找"a",结果是3次)

代码实现(对应你要的结果3)

假设你的场景是不重叠统计3次(比如母串"abcabcabc",子串"abc"),代码如下:

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

int main() {
    char haystack[] = "abcabcabc"; // 母串,子串"abc"出现3次
    char needle[] = "abc";         // 要查找的子串
    int count = 0;
    char *pos = haystack;          // 初始查找起始位置指向母串开头

    // 循环查找直到找不到子串
    while ((pos = strstr(pos, needle)) != NULL) {
        count++; // 找到一次,计数器加1
        // 移动到子串末尾的下一个字符,避免重复匹配当前子串
        pos += strlen(needle);
        
        // 额外提醒:如果子串是空串,这里要加判断防止死循环,比如:
        // if (strlen(needle) == 0) break;
    }

    printf("子串出现次数:%d\n", count); // 输出3,符合预期
    return 0;
}

如果是重叠统计场景(比如母串"aaa"找"a"得3次)

只需要把pos += strlen(needle)改成pos += 1即可:

// ... 其他代码不变
pos += 1;
// ...

关键细节提醒

  • 确保子串不是空字符串:如果子串长度为0,strstr()会直接返回母串起始地址,导致无限循环,一定要提前判断。
  • 如果母串是const char*类型,记得把pos也声明为const char*,避免类型不匹配。

这样写就能准确统计出你想要的次数啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:00:12