在C语言中,strstr
函数用于查找一个字符串中是否包含另一个字符串,并返回第一次出现的地址。标准库中的strstr
实现已经较为完备,但在一些情况下,我们可能需要增强它的功能,以满足特定的需求。本文将设计一个“增强的strstr
”函数,支持更多功能。
功能需求
- 支持不区分大小写的查找:增强的
strstr
函数可以选择是否忽略大小写。 - 查找计数:可以返回子串在主串中出现的次数。
- 查找位置:可以返回所有匹配位置的索引。
增强的strstr
实现
以下是一个具体的实现代码,包含了上述功能:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct {
int count; // 子串出现的次数
int *positions; // 存储所有匹配位置的数组
} SearchResult;
// 检查大小写匹配
int case_insensitive_compare(char a, char b) {
return tolower(a) == tolower(b);
}
// 增强的 strstr 函数
SearchResult enhanced_strstr(const char *haystack, const char *needle, int ignore_case) {
SearchResult result;
result.count = 0;
result.positions = NULL;
if (!haystack || !needle || strlen(needle) == 0) {
return result;
}
int needle_len = strlen(needle);
int haystack_len = strlen(haystack);
int max_positions = haystack_len / needle_len + 1; // 最大可能的匹配数量
result.positions = (int *)malloc(max_positions * sizeof(int));
for (int i = 0; i <= haystack_len - needle_len; i++) {
int match = 1;
for (int j = 0; j < needle_len; j++) {
if (ignore_case) {
if (!case_insensitive_compare(haystack[i + j], needle[j])) {
match = 0;
break;
}
} else {
if (haystack[i + j] != needle[j]) {
match = 0;
break;
}
}
}
if (match) {
result.positions[result.count] = i; // 记录匹配的位置
result.count++;
}
}
// 重新分配内存以适应实际找到的位置
result.positions = realloc(result.positions, result.count * sizeof(int));
return result;
}
// 主函数示例
int main() {
char haystack[] = "Hello, welcome to the world of programming. Hello!";
char needle[] = "hello";
SearchResult result = enhanced_strstr(haystack, needle, 1); // 1表示不区分大小写
printf("子串 \"%s\" 在主串中出现的次数: %d\n", needle, result.count);
if (result.count > 0) {
printf("匹配位置: ");
for (int i = 0; i < result.count; i++) {
printf("%d ", result.positions[i]);
}
}
free(result.positions); // 释放分配的内存
return 0;
}
代码解析
- 数据结构定义:
-
SearchResult
结构体包含子串出现的次数和存放匹配位置的数组。 -
大小写比较函数:
-
case_insensitive_compare
用于比较两个字符,忽略其大小写。 -
增强的
strstr
函数实现: - 函数接受三个参数:主串、子串和是否忽略大小写的标志。
- 通过循环遍历主串,检查每个可能的起始位置,判断子串是否存在。
- 如果匹配,记录该位置并增加计数。
-
最后,重分配内存以适应实际匹配的位置,并返回结果。
-
主函数示例:
- 提供了一个简单的测试用例,可以修改
haystack
和needle
的值来验证不同情况。
总结
通过构建一个增强的strstr
函数,我们可以扩展C语言标准库中字符串处理的能力,满足更复杂的需求。通过不区分大小写的查找、返回匹配计数、查找位置,我们能更灵活地处理文本数据,提升编程的效率与便利。