技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2226|回复: 3
收起左侧

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

[复制链接]

1044

主题

2340

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
217
威望
294 点
宅币
18288 个
贡献
37113 次
宅之契约
0 份
在线时间
1742 小时
注册时间
2014-1-26
发表于 2015-4-2 13:04:47 | 显示全部楼层 |阅读模式

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

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

x
百度来的,CSDN下的,经过我的修改了的。
注意开头那个“Copyleft”
[C] 纯文本查看 复制代码
//=============================================================================
//通配符匹配算法
//Copyleft JoStudio
//-----------------------------------------------------------------------------
#include<ctype.h>

//定义和宏
#define MATCH      1
#define NOT_MATCH  0

//匹配一个字符的宏
#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;
}

1044

主题

2340

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
217
威望
294 点
宅币
18288 个
贡献
37113 次
宅之契约
0 份
在线时间
1742 小时
注册时间
2014-1-26
 楼主| 发表于 2015-4-2 13:07:00 | 显示全部楼层
用VB的话,有个“Like”运算符。。。然后代码是零行。。

36

主题

146

帖子

7193

积分

用户组: 管理员

UID
77
精华
11
威望
115 点
宅币
6630 个
贡献
132 次
宅之契约
0 份
在线时间
108 小时
注册时间
2014-2-22
发表于 2015-4-2 16:20:25 | 显示全部楼层
应该添加几个使用范例

3

主题

20

帖子

49

积分

用户组: 初·技术宅

UID
1931
精华
0
威望
0 点
宅币
29 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-8-29
发表于 2016-8-29 16:56:51 | 显示全部楼层
美俪女神 发表于 2015-4-2 16:20
应该添加几个使用范例

比较赞同,添加范例

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-10-14 11:28 , Processed in 0.101474 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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