C语言 域名通配符实现

本例实现通配符 * 的功能,不支持*在字符串的末尾, 仅提供思路,函数仅做简单单元测试。 如有使用,还请自己进行修改

// str1: 待匹配字符串
// str2: 带通配符字串
int wildcard_match(char *str1, char *str2)
{
    if(str1 == NULL || str2 == NULL)
        return 0 ;

    int len1 = strlen(str1);
    int len2 = strlen(str2);

    char *tmp_str = str2 ;
    int tmp_len = len2 ;
    int location = 0 ;
    int match_flag = 0 ;
    int i = 0 ;

    // 查询 str2中是否含有通配符 *, 两种方法,从前、后分别找*
 /*   while(tmp_len--) {
        if(tmp_str[tmp_len] == '*'){
            location = tmp_len+1 ; // +1 for judge when the * be the first letter.
            break ;
        }
    } */

    while(i<tmp_len) {
        if(tmp_str[i] == '*') {
            location = i+1 ; // 加1 是为了处理 *出现在开头的情况。 在开头的话,location == 0;
            break ;
        }
        i++ ;
    }

    // Get the *
    char *tmp_str1 = str1 ;
    char *tmp_str2 = str2 ;

    // 如果找到location 不为0 ,那么就进行通配符匹配。
    if(location) {
        location -= 1;
        // if location is 0 , the strncmp function will return 0 too .
        //现对比* 前的字符串, 如果前面都没匹配,直接返回未匹配结果
        if(!strncmp(str1, str2, location)) {
            tmp_len = len2 - location ;
            tmp_str1 += len1 ;
            tmp_str2 += len2 ;

            //在匹配*后的字符串,从尾往前找。
            while(--tmp_len && (*tmp_str1 == *tmp_str2)){
                tmp_str1 -- ;
                tmp_str2 -- ;
            }

            match_flag = tmp_len?0:1 ;
        } 
    } 

    return match_flag ;
}
原文地址:https://www.cnblogs.com/wanhl/p/6496589.html