参考:https://blog.csdn.net/c80486/article/details/6584769
#include <stdio.h>
#include <ctype.h>/** Defines and Macros */
#define MATCH 1
#define NOT_MATCH 0/* 匹配一个字符的宏 */
#define MATCH_CHAR(c1,c2,ignore_case) ( (c1==c2) || ((ignore_case==1) &&(tolower(c1)==tolower(c2))) )/*
* 通配符匹配算法
* @param src [i] 字符串
* @param pattern [i] 含有通配符( * 或 ? 号)的字符串
* @param ignore_case [i] 是否区分大小写,1 表示不区分, 0 表示区分
* @retval 1 src 匹配 pattern
* @retval 0 不匹配
*/
int WildCharMatch(char *src, char *pattern, int ignore_case)
{
int result;
while (*src)
{
if (*pattern == '*')
{
/* 如果 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没有结束*/
/* 如果pattern有最后一位字符且是'*' */
if ( (*pattern=='*') && (*(pattern+1)==0) )
return MATCH;
else
return NOT_MATCH;
}
else
{
return MATCH;
}
}
/*
* 如下: 如果匹配字符串的首字符(如pattern = "*abc", 其中的a)在待匹配的字符串(如ababd)中有多个时,
* 就会匹配失败。原因是移动任意长的逻辑有欠缺。
*/
int main(int argc, const char **argv)
{
int n;
/* 旧算法匹配失败案例,新算法正常 */
n = WildCharMatch("A-2-101~122 -7.7_t3.txt", "*.txt", 1); //返回1
printf("\nresult: %d\n",n);
n = WildCharMatch("hello.txt", "hel*.txt", 1); //返回1
printf("\nresult: %d\n",n);
n = WildCharMatch("Aaa.txt","*.txt",1); //返回1
printf("\nresult: %d\n",n);n = WildCharMatch("Aaaa","a*a",1); //返回1
printf("\nresult: %d\n",n);n = WildCharMatch("Aaaa","a*a",0); //返回0
printf("\nresult: %d\n",n);n = WildCharMatch("ABA","a?a",1); //返回1
printf("\nresult: %d\n",n);n = WildCharMatch("ABAd","a?a",1); //返回0
printf("\nresult: %d\n",n);
return 0;
}