#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. 基本情况:

    • 如果两个字符串同时结束,则匹配成功。
    • 如果其中一个字符串结束,另一个还有剩余字符,则匹配失败。
  2. 处理 '?' 通配符:

    • 如果第二个字符串的当前字符是 '?', 则忽略当前字符,继续比较下一个字符。
  3. 处理 '*' 通配符:

    • 如果第二个字符串的当前字符是 '', 则尝试用 '' 匹配第一个字符串的任意长度的子串(包括空串)。
    • 为了实现这一点,代码会跳过连续的 '*',然后遍历第一个字符串,依次尝试从当前位置开始匹配剩余的第二个字符串。
  4. 普通字符匹配:

    • 如果当前字符不是通配符,则直接比较两个字符串的当前字符是否相等。如果相等,则继续比较下一个字符,否则匹配失败。

示例:

  • 输入字符串1: 'aaab'

  • 输入字符串2: 'aa*b'

  • 输出: 'yes'

  • 输入字符串1: 'acdcb'

  • 输入字符串2: 'a*c?b'

  • 输出: 'yes'

总结:

这段代码提供了一个简单易懂的字符串通配符匹配算法实现。该算法可以有效地处理包含 '*' 和 '?' 通配符的字符串匹配问题,并且代码简洁易懂,方便学习和理解。

C语言实现字符串通配符匹配算法

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

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