判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有‘*’和‘?’,且通配符不会连续出现 。(要求完全匹配,而不是包含)
其中,通配符‘*’:代替0个或多个字符,通配符‘?’:代替一个字符
l 要求实现函数
int GetMatchSta (const char *ArrStr, const char *KeyStr)
【输入】 ArrStr: 给定的字符串
KeyStr: 包含通配符的匹配字符串
【输出】无
【返回】是否匹配,匹配返回1,不匹配返回0
l 示例
输入:” abcdefg”, “a*'”
返回:1
输入:“tommababcabc” , t?m*ab*abc
返回:1
实现想法,很自然的自动机分析,直接匹配。
#include <stdio.h>
int GetMatchSta(const char *ArrStr, const char *KeyStr)
{
int starnext = 0;
int keyidx = 0;
int stridx = 0;
int match = 0;
while (1)
{
if (ArrStr[stridx] == '\0' )
{
if (KeyStr[keyidx] == '\0')
match = 1;
break;
}
if (KeyStr[keyidx] == '?')
{
keyidx++;
stridx++;
}
else if (KeyStr[keyidx] == '*')
{
starnext = keyidx+1;
keyidx++;
}
else
{
if (KeyStr[keyidx] != ArrStr[stridx] && starnext != 0)
{
keyidx = starnext;
if (KeyStr[keyidx] != ArrStr[stridx])
stridx++;
}
else if (KeyStr[keyidx] != ArrStr[stridx] && starnext == 0)
{
break;
}
else
{
keyidx++;
stridx++;
}
}
}//end while
return match;
}
int main()
{
char *str1="abcdefg";
char *kstr1 = "a*";
char *str2 = "tommababcabc";
char *kstr2 = "t?m*ab*abc";
char *str3 = "011099";
char *kstr3 = "0*1*9?";
printf("%d\n",GetMatchSta(str1, kstr1));
printf("%d\n",GetMatchSta(str2, kstr2));
printf("%d\n",GetMatchSta(str3, kstr3));
return 0;
}