C语言实现字符串通配符匹配算法
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
// 判断两个字符串是否匹配
bool isMatch(char* str1, char* str2) {
if (*str1 == '\0' && *str2 == '\0') {
// 如果两个字符串同时结束,则匹配成功
return true;
}
if (*str1 == '\0' || *str2 == '\0') {
// 如果其中一个字符串结束,另一个还有剩余字符,则匹配失败
return false;
}
if (*str2 == '?') {
// 如果第二个字符串的当前字符为'?', 则继续匹配下一个字符
return isMatch(str1 + 1, str2 + 1);
}
if (*str2 == '*') {
// 如果第二个字符串的当前字符为'*', 则进行通配符匹配
// 跳过连续的通配符'*'
while (*str2 == '*') {
str2++;
}
// 遍历第一个字符串,依次尝试匹配剩余的字符
while (*str1) {
if (isMatch(str1, str2)) {
return true;
}
str1++;
}
}
if (*str1 == *str2) {
// 如果当前字符匹配,则继续匹配下一个字符
return isMatch(str1 + 1, str2 + 1);
}
// 其他情况下,匹配失败
return false;
}
int main() {
char str1[100];
char str2[100];
printf('请输入第一个字符串:');
fgets(str1, sizeof(str1), stdin);
printf('请输入第二个字符串:');
fgets(str2, sizeof(str2), stdin);
// 去除字符串中的换行符
str1[strcspn(str1, '\n')] = '\0';
str2[strcspn(str2, '\n')] = '\0';
bool match = isMatch(str1, str2);
if (match) {
printf('yes\n');
} else {
printf('no\n');
}
return 0;
}
这段C语言代码实现了一个简单的字符串通配符匹配算法。该算法通过递归的方式,判断两个字符串是否匹配,其中一个字符串可以包含通配符 '*' 和 '?'。
算法解释:
-
基本情况:
- 如果两个字符串同时结束,则匹配成功。
- 如果其中一个字符串结束,另一个还有剩余字符,则匹配失败。
-
处理 '?' 通配符:
- 如果第二个字符串的当前字符是 '?', 则忽略当前字符,继续比较下一个字符。
-
处理 '*' 通配符:
- 如果第二个字符串的当前字符是 '', 则尝试用 '' 匹配第一个字符串的任意长度的子串(包括空串)。
- 为了实现这一点,代码会跳过连续的 '*',然后遍历第一个字符串,依次尝试从当前位置开始匹配剩余的第二个字符串。
-
普通字符匹配:
- 如果当前字符不是通配符,则直接比较两个字符串的当前字符是否相等。如果相等,则继续比较下一个字符,否则匹配失败。
示例:
-
输入字符串1: 'aaab'
-
输入字符串2: 'aa*b'
-
输出: 'yes'
-
输入字符串1: 'acdcb'
-
输入字符串2: 'a*c?b'
-
输出: 'yes'
总结:
这段代码提供了一个简单易懂的字符串通配符匹配算法实现。该算法可以有效地处理包含 '*' 和 '?' 通配符的字符串匹配问题,并且代码简洁易懂,方便学习和理解。
原文地址: http://www.cveoy.top/t/topic/bHxq 著作权归作者所有。请勿转载和采集!