找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3541|回复: 3

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

[复制链接]
发表于 2015-4-2 13:04:47 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

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

  6. //定义和宏
  7. #define MATCH      1
  8. #define NOT_MATCH  0

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

  11. //=============================================================================
  12. //函数:WildCharMatch
  13. //描述:判断字符串是否匹配通配符
  14. //-----------------------------------------------------------------------------
  15. int WildCharMatch
  16. (
  17.         char*src,                //源字符串
  18.         char*pattern,        //模板
  19.         int        ignore_case        //是否无视符号
  20. )
  21. {
  22.         int result;

  23.         while(*src)
  24.         {
  25.                 if(*pattern=='*')
  26.                 {
  27.                         //跳过多余的*
  28.                         while((*pattern=='*')||(*pattern=='?'))
  29.                                 pattern++;

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

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

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

  47.                         //返回结果
  48.                         return result;
  49.                 }
  50.                 else
  51.                 {
  52.                         //如果pattern中当前字符不是'*'
  53.                         //匹配当前字符
  54.                         if(MATCH_CHAR(*src,*pattern,ignore_case)||('?'==*pattern))
  55.                                 //src,pattern分别前进一位,继续匹配
  56.                                 return WildCharMatch (++src, ++pattern, ignore_case);
  57.                         else
  58.                                 return NOT_MATCH;
  59.                 }
  60.         }

  61.         //如果src结束了,看pattern有否结束
  62.         if(*pattern)  
  63.         {
  64.                 //pattern没有结束
  65.                 if((*pattern=='*')&&(*(pattern+1)==0))//如果pattern有最后一位字符且是'*'
  66.                         return MATCH;
  67.                 else
  68.                         return NOT_MATCH;
  69.         }
  70.         else
  71.                 return MATCH;
  72. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-4-2 13:07:00 | 显示全部楼层
用VB的话,有个“Like”运算符。。。然后代码是零行。。
回复 赞! 靠!

使用道具 举报

发表于 2015-4-2 16:20:25 | 显示全部楼层
应该添加几个使用范例
回复 赞! 靠!

使用道具 举报

发表于 2016-8-29 16:56:51 | 显示全部楼层
美俪女神 发表于 2015-4-2 16:20
应该添加几个使用范例

比较赞同,添加范例
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 11:38 , Processed in 0.031370 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表