C语言增强strstr函数:支持可选段模糊查询

本示例实现了一个名为enhanced_strstr的函数,该函数是对标准库函数strstr的增强,支持使用可选段(用'[]'标识)进行模糊查询。可选段表示该位置可以匹配任意一个字符,例如'a[bc]'可以匹配ab或ac。函数返回匹配子字符串相对于源字符串地址的偏移,如果没有匹配则返回-1。

代码示例

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

int enhanced_strstr(const char *haystack, const char *needle) {
    int haystack_len = strlen(haystack);
    int needle_len = strlen(needle);
    
    for (int i = 0; i <= haystack_len - needle_len; i++) {
        int j;
        for (j = 0; j < needle_len; j++) {
            if (needle[j] == '[') {
                int k;
                for (k = j + 1; k < needle_len; k++) {
                    if (needle[k] == ']') {
                        break;
                    }
                }
                if (k == needle_len) {
                    // 非法的可选段表示
                    return -1;
                }
                // 检查可选段中的字符是否匹配
                int found = 0;
                for (int l = j + 1; l < k; l++) {
                    if (haystack[i + j] == needle[l]) {
                        found = 1;
                        break;
                    }
                }
                if (!found) {
                    break;
                }
                j = k;
            } else {
                if (haystack[i + j] != needle[j]) {
                    break;
                }
            }
        }
        if (j == needle_len) {
            // 找到匹配子字符串
            return i;
        }
    }
    
    // 没有找到匹配子字符串
    return -1;
}

int main() {
    char haystack[100];
    char needle[100];
    
    printf("Enter the haystack: ");
    fgets(haystack, sizeof(haystack), stdin);
    printf("Enter the needle: ");
    fgets(needle, sizeof(needle), stdin);
    
    // 去除输入中的换行符
    haystack[strcspn(haystack, "\n")] = '\0';
    needle[strcspn(needle, "\n")] = '\0';
    
    int result = enhanced_strstr(haystack, needle);
    printf("Result: %d\n", result);
    
    return 0;
}

函数说明

  • enhanced_strstr(const char *haystack, const char *needle)
    • 参数:
      • haystack:源字符串
      • needle:目标字符串(可能包含可选段)
    • 返回值:
      • 匹配子字符串相对于源字符串地址的偏移,从0开始算
      • 如果没有匹配,则返回-1

使用示例

输入:
haystack: abcdefg
needle: a[bc]d
输出:
Result: 0

输入:
haystack: abcdefg
needle: [ab]cd
输出:
Result: 1

输入:
haystack: abcdefg
needle: [xy]z
输出:
Result: -1

代码解析

  • 函数使用双层循环遍历源字符串和目标字符串
  • 当目标字符串遇到'['时,进入可选段匹配逻辑
    • 找到可选段的结束符号']',并将可选段中的字符与源字符串对应位置的字符进行比较
    • 如果可选段中的任意一个字符与源字符串对应位置的字符匹配,则认为匹配成功,继续比较下一个字符
  • 如果目标字符串中没有可选段或者所有字符都匹配成功,则返回匹配子字符串相对于源字符串地址的偏移
  • 如果目标字符串中存在非法可选段(例如没有匹配的']'),则返回-1
  • 如果没有匹配,则返回-1

注意

  • 目标字符串中可选段可能出现多次
  • 目标字符串的长度可能比源字符串的长度长
  • 函数不传入字符串长度,而是使用strlen函数获取字符串长度
C语言增强strstr函数:支持可选段模糊查询

原文地址: https://www.cveoy.top/t/topic/cv2L 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录