关于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
相关产品推荐
相关产品推荐

