C语言增强strstr函数:支持可选段模糊查询
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函数获取字符串长度
原文地址: https://www.cveoy.top/t/topic/cv2L 著作权归作者所有。请勿转载和采集!