C语言如何计算子串在字符串中出现的次数
这篇文章将为大家详细讲解有关C语言如何计算子串在字符串中出现的次数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
C语言计算子串在字符串中出现的次数
字符串处理在编程中至关重要,而计算子串在字符串中出现的次数是一个常见的任务。C语言提供了多种实现该功能的方法。
方法 1:使用 strstr() 函数
strstr() 函数返回一个指向子串在字符串中首次出现的字符的指针。我们可以使用一个循环来遍历字符串并调用 strstr(),直到它返回 NULL,表明子串不再出现。
int count_occurrences(char *str, char *substr) {
int count = 0;
char *ptr = strstr(str, substr);
while (ptr != NULL) {
count++;
ptr = strstr(ptr + 1, substr);
}
return count;
}
方法 2:使用 strstr() 和 strncmp() 函数
此方法类似于上述方法,但使用 strncmp() 函数来比较子串和当前字符串位置。
int count_occurrences(char *str, char *substr) {
int count = 0;
char *ptr = str;
while (*ptr != " ") {
if (strncmp(ptr, substr, strlen(substr)) == 0) {
count++;
ptr += strlen(substr);
} else {
ptr++;
}
}
return count;
}
方法 3:使用 Boyer-Moore 算法
Boyer-Moore 算法是一种高效的字符串搜索算法,特别适合查找单个模式字符串在文本字符串中的出现次数。以下是用 C 语言实现 Boyer-Moore 算法的示例:
#include <stdio.h>
#include <string.h>
int bm_preprocess(char *pattern, int pattern_len, int *last) {
int i, j;
for (i = 0; i < 256; i++) {
last[i] = -1;
}
for (j = 0; j < pattern_len; j++) {
last[pattern[j]] = j;
}
}
int bm_search(char *text, int text_len, char *pattern, int pattern_len, int *last) {
int i, j;
j = pattern_len - 1;
while (j < text_len) {
i = pattern_len - 1;
while (i >= 0 && pattern[i] == text[j]) {
i--;
j--;
}
if (i < 0) {
return j + 1;
} else {
j += pattern_len - 1 - last[text[j]];
}
}
return -1;
}
int count_occurrences(char *str, char *substr) {
int last[256];
int count = 0;
bm_preprocess(substr, strlen(substr), last);
int index = bm_search(str, strlen(str), substr, strlen(substr), last);
while (index >= 0) {
count++;
index = bm_search(str + index, strlen(str) - index, substr, strlen(substr), last);
}
return count;
}
选择合适的算法
算法的选择取决于字符串和子串的长度以及要处理的字符串数量。对于短字符串和少量出现,方法 1 或 2 通常就足够了。对于较长的字符串和大批量出现,Boyer-Moore 算法提供了更高的效率。
以上就是C语言如何计算子串在字符串中出现的次数的详细内容,更多请关注编程学习网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341