在C语言中,strstr函数用于查找一个字符串中是否包含另一个字符串,并返回第一次出现的地址。标准库中的strstr实现已经较为完备,但在一些情况下,我们可能需要增强它的功能,以满足特定的需求。本文将设计一个“增强的strstr”函数,支持更多功能。

功能需求

  1. 支持不区分大小写的查找:增强的strstr函数可以选择是否忽略大小写。
  2. 查找计数:可以返回子串在主串中出现的次数。
  3. 查找位置:可以返回所有匹配位置的索引。

增强的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;
}

代码解析

  1. 数据结构定义
  2. SearchResult结构体包含子串出现的次数和存放匹配位置的数组。

  3. 大小写比较函数

  4. case_insensitive_compare用于比较两个字符,忽略其大小写。

  5. 增强的strstr函数实现

  6. 函数接受三个参数:主串、子串和是否忽略大小写的标志。
  7. 通过循环遍历主串,检查每个可能的起始位置,判断子串是否存在。
  8. 如果匹配,记录该位置并增加计数。
  9. 最后,重分配内存以适应实际匹配的位置,并返回结果。

  10. 主函数示例

  11. 提供了一个简单的测试用例,可以修改haystackneedle的值来验证不同情况。

总结

通过构建一个增强的strstr函数,我们可以扩展C语言标准库中字符串处理的能力,满足更复杂的需求。通过不区分大小写的查找、返回匹配计数、查找位置,我们能更灵活地处理文本数据,提升编程的效率与便利。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部