C语言实现:【问题描述】判断两个字符串是否匹配,其中一个字符串中包括通配符"*"或"?"(串)。"*"代表0个或多个字 符,"?"代表一个字符 Judge whether two strings match, one of which contains a wildcard "*" or "?" string. "*" represents 0 or more characters and "?" represents one character. 【输入形式】 分两行输入两个字符串,以#结束,其中一个字符串中包括通配符"*"或"?"(串),另一个为不包 含"*"和"?"的确定字符串 【输出形式】 判断两个字符串是否匹配,若匹配,输出yes,不匹配输出no 【样例输入】 da?a*tru*e# datastructure# 【样例输出】 No 【样例说明】 其中一个字符串中包含通配符,另一个字符串为确定字符串。字符串中可能有空格,字母均为 小写字母。
时间: 2024-04-15 13:04:34 浏览: 118
好的,下面是 C 语言实现的代码,供你参考:
```c
#include <stdio.h>
#include <string.h>
#define MAXLEN 100 // 串的最大长度
int match(char *s1, char *s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
int i = 0, j = 0, k = -1, m = -1;
while (i < len1) {
if (j < len2 && (s1[i] == s2[j] || s2[j] == '?')) {
i++;
j++;
} else if (j < len2 && s2[j] == '*') {
k = i;
m = j;
j++;
} else if (m != -1) {
k++;
i = k;
j = m + 1;
} else {
return 0;
}
}
while (j < len2 && s2[j] == '*') {
j++;
}
return j == len2;
}
int main() {
char s1[MAXLEN], s2[MAXLEN];
fgets(s1, MAXLEN, stdin);
fgets(s2, MAXLEN, stdin);
s1[strcspn(s1, "\r\n")] = '\0'; // 去掉换行符
s2[strcspn(s2, "\r\n")] = '\0';
if (match(s1, s2)) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
```
程序中的 `match` 函数实现了判断两个字符串是否匹配的功能,具体思路如下:
- 从头开始遍历两个字符串,如果当前字符相等或者 s2 中的字符是问号,则继续比较下一个字符;
- 如果 s2 中的字符是星号,则记录下当前位置,继续遍历 s1 和 s2 的下一个字符;
- 如果 s2 中的字符不是问号或者星号,则需要回溯,将上一次记录的位置向后移动一个字符,并重新开始比较;
- 如果 s1 中的字符已经遍历完,而 s2 中还有星号,则将 s2 中的星号全部匹配掉。
程序运行时,会提示用户输入两个字符串,其中一个字符串中包括通配符 "*" 或 "?",另一个为确定字符串,然后输出匹配结果。如果输入的字符串中包含空格,则空格也会被当作字符处理。
阅读全文