0xAA55 发表于 2015-4-2 13:04:47

【搬运】wildchar.c:判断通配符是否匹配的简单ANSI C源码

百度来的,CSDN下的,经过我的修改了的。
注意开头那个“Copyleft”//=============================================================================
//通配符匹配算法
//Copyleft JoStudio
//-----------------------------------------------------------------------------
#include<ctype.h>

//定义和宏
#define MATCH      1
#define NOT_MATCH0

//匹配一个字符的宏
#define MATCH_CHAR(c1,c2,ic) ((c1==c2)||((ic==1)&&(tolower(c1)==tolower(c2))))

//=============================================================================
//函数:WildCharMatch
//描述:判断字符串是否匹配通配符
//-----------------------------------------------------------------------------
int WildCharMatch
(
        char*src,                //源字符串
        char*pattern,        //模板
        int        ignore_case        //是否无视符号
)
{
        int result;

        while(*src)
        {
                if(*pattern=='*')
                {
                        //跳过多余的*
                        while((*pattern=='*')||(*pattern=='?'))
                                pattern++;

                        //如果*后没有字符了,匹配
                        if(!*pattern)return MATCH;

                        //在src中查找一个与pattern中'*'后的一个字符相同的字符
                        while(*src&&(!MATCH_CHAR(*src,*pattern,ignore_case)))
                                src++;
                               
                        //如果找不到,则匹配失败
                        if(!*src)return NOT_MATCH;

                        //否则匹配剩下的字符串
                        result=WildCharMatch(src,pattern,ignore_case);
                       
                        //剩下的字符串匹配不上但src后一个字符等于pattern中'*'后的一个字符
                        //src前进一位,继续匹配
                        while((!result)&&
                                  (*(src+1))&&
                                  MATCH_CHAR(*(src+1),*pattern,ignore_case))
                                result=WildCharMatch (++src,pattern,ignore_case);

                        //返回结果
                        return result;
                }
                else
                {
                        //如果pattern中当前字符不是'*'
                        //匹配当前字符
                        if(MATCH_CHAR(*src,*pattern,ignore_case)||('?'==*pattern))
                                //src,pattern分别前进一位,继续匹配
                                return WildCharMatch (++src, ++pattern, ignore_case);
                        else
                                return NOT_MATCH;
                }
        }

        //如果src结束了,看pattern有否结束
        if(*pattern)
        {
                //pattern没有结束
                if((*pattern=='*')&&(*(pattern+1)==0))//如果pattern有最后一位字符且是'*'
                        return MATCH;
                else
                        return NOT_MATCH;
        }
        else
                return MATCH;
}

0xAA55 发表于 2015-4-2 13:07:00

用VB的话,有个“Like”运算符。。。然后代码是零行。。

Golden Blonde 发表于 2015-4-2 16:20:25

应该添加几个使用范例

悠悠寒冰 发表于 2016-8-29 16:56:51

美俪女神 发表于 2015-4-2 16:20
应该添加几个使用范例

比较赞同,添加范例
页: [1]
查看完整版本: 【搬运】wildchar.c:判断通配符是否匹配的简单ANSI C源码