包含通配符的字符串匹配

本文介绍了一个C语言实现的函数intGetMatchSta,用于判断给定的字符串(ArrStr)是否完全匹配包含*和?通配符的键字符串(KeyStr)。函数通过指针逐字符比较,确保通配符的正确使用和完全匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

字符串匹配。判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有 ' * ' 和 ' ? ' ,且通配符不会连续出现。(要求完全匹配,而不是包含)。其中,通配符 ' * ':代替О个或多个字符,通配符' ? '代替一个字符。

说明:要求实现函数,并用主函数验证之。

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;
}

代码运行截图:

如果内容对你有小小的帮助,请帮我点个赞吧!谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪脱脱写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值