问题描述:
字符串匹配。判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有 ' * ' 和 ' ? ' ,且通配符不会连续出现。(要求完全匹配,而不是包含)。其中,通配符 ' * ':代替О个或多个字符,通配符' ? '代替一个字符。
说明:要求实现函数,并用主函数验证之。
int GetMatchSta (char*ArrStr, char *KeyStr)
输入: ArrStr:给定的字符串,KeyStr:包含通配符的匹配字符串。
输出:无
返回:是否匹配,匹配返回1,不匹配返回0
示例:
输入:”abcdefg","a*" 返回:1,*号可以与后面的多个字符匹配
输入:“tommababcabc”, "t?m*ab*abc",返回:1,?号替代o,第一个*号替代m,第二个*号替代abc
方法:先将两个字符串的长度算出来,然后分别用两个指针(i,j)指向两个字符串的开头,如果匹配或者通配符是' ? ',则i,j都往后移动继续比较。如果通配符是' * ',也继续往后移动比较,此时设置flag为1,代表前面遇到的通配符是' * ',*号后面字符不匹配时,根据flag的值,可以让j--回到*号的位置继续比较。比较完毕后返回1,如果不符合比较条件,则直接在for循环里面返回0;
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int getmatchstr(char* arrstr, char* keystr) {
int i, j, flag = 0, len1, len2;
for (len1 = 0; arrstr[len1] != '\0'; len1++);//计算字符串长度
for (len2 = 0; keystr[len2] != '\0'; len2++);
for (i = 0, j = 0; i < len1, j < len2;) {
if (arrstr[i] == keystr[j] || keystr[j] == '?') {//第一种情况,相等或通配符是“?”
i++;
j++;
flag = 0;
}
else if (keystr[j] == '*') {//通配符是“ * ”,则当做一个匹配字符进行比较
i++;
j++;
flag = 1; //设置flag的值为1,说明当前通配符是*号,后一个字符不匹配时可以回到这里
if (arrstr[i] == keystr[j]) {
i++;
j++;
flag = 0;//如果*号后面是匹配的字符,则将flag值重置为0,代表前面的*完成使命
}
else if (arrstr[i] != keystr[j] && flag == 1) {//否则*还得继续代表其他字符
j--;
}
}
else return 0;
}
return 1;
}
int main() {
char arrstr[81];
char keystr[81];
gets(arrstr);//获取两个字符串
gets(keystr);
if (getmatchstr(arrstr, keystr)) {//调用函数
printf("Yes\n");
}
else printf("No\n");
return 0;
}
代码运行截图:
如果内容对你有小小的帮助,请帮我点个赞吧!谢谢!