比较字符串与通配符

在C中,我怎样才能将包含* (可以是任何字符组合)的字符串与字符串的二维矩阵进行比较?

例如,我有一个单词go*s 。 它可以生成单词“华丽”( *是“orgeou”),“善良”,“山羊”,“去”等。我应该从整个字典中读取单词并将它们与包含一个或一个单词的单词进行比较更多星号( * )。 必须打印每个可以用带星号的单词生成的单词。 如果两个单词的长度相同,那么很容易比较,因为*只能是一个字母。

 int fq(char *s1, char *s2){ int i, a=0, b=0, s=0; while (1){ if (s1[a]=='\0') break; a++; } if (strlen(s1)==strlen(s2)){ for(i=0; i<a; i++){ if (s1[i]=='*'){ b++; } if (s1[i]==s2[i]){ b++; } } } if (b==a) return 1; 

通过逐字符检查模式字符串并应用以下规则,您可以非常轻松地编写一个递归函数,用于将sting与另一个字符串与其中的通配符进行比较:

  • 如果pattern [p] ==’\ 0’:如果候选[c] ==’\ 0’则模式匹配
  • 如果pattern [p] ==’*’:尝试匹配候选[c] …候选[c + n]和模式[p + 1]
  • 如果模式[p]!=’?’ 和模式[p]!=候选人[c]:不匹配
  • 否则,匹配模式[p + 1]与候选人[c + 1]

这几条规则可以很容易地编写为匹配的递归函数:

 #include  bool match(const char *pattern, const char *candidate, int p, int c) { if (pattern[p] == '\0') { return candidate[c] == '\0'; } else if (pattern[p] == '*') { for (; candidate[c] != '\0'; c++) { if (match(pattern, candidate, p+1, c)) return true; } return match(pattern, candidate, p+1, c); } else if (pattern[p] != '?' && pattern[p] != candidate[c]) { return false; } else { return match(pattern, candidate, p+1, c+1); } } 

那么,你可以这样做:

 match("f*o", "foo", 0, 0); 

这不是一种有效的方法,但我认为它很容易理解和实施。 如果你需要更高效的东西,你可以从这些开始: http : //en.wikipedia.org/wiki/String_searching_algorithm

以下内容适用于包含单个*的输入字符串。

  1. 在输入单词的开头一次开始比较一个字符。
  2. 如果遇到* ,则向后比较最后一个字符的两个字符串。
  3. 如果您不匹配,请返回0
  4. 如果你遇到*你已经完成了。
  5. 在不匹配时,返回0

(添加:这个算法也适用于*在第一个或最后一个位置。)

你可以检查前两个字符是否“go”,如果最后一个是’s’。

最简单的方法,我看到的是一个简单的条件:

 if (strncmp(str, "go", 2) == 0 && str[strlen(str) - 1] == 's') 

如果字符串匹配,strncmp返回0。

你还应该确保字符串长度至少为2个字符,否则你在比较字符串的2个字符时会出现分段错误,你可以添加上述条件:

 strlen(str) >= 2