使用通配符查找char []中的子字符串

时间:2015-10-21 16:30:26

标签: c arrays substring wildcard

我有一个字符数组,一旦用户输入一串字符,我的程序需要在我的大字符数组中找到字符串并报告其索引。但是,如果有!之类的通配符,这将代表我的数组中的任何字符,我如何允许我的程序以任何字母的形式阅读!

示例:

char letter [] = {a,b,c,d,e,d,s,f,e}

如果用户输入ab!,程序可以将其解释为abc并返回其找到abc的索引值。

1 个答案:

答案 0 :(得分:0)

您可以实现自己的strstr版本,这会增加一个简单的额外条件。让我们调用函数StrStr

char* StrStr(const char *str, const char *target) {
  if (!*target) return NULL;
  char *p1 = (char*)str;
  while (*p1) {
    char *p1Begin = p1, *p2 = (char*)target;
    while (*p1 && *p2 && (*p1 == *p2 || *p2 == '!')) {
      p1++;
      p2++;
    }
    if (!*p2)
      return p1Begin;
    p1 = p1Begin + 1;
  }
  return NULL;
}

这只会测试target中是否找到str并会比较每个字符。如果角色是感叹号,如果它们不同,它将被忽略。

您可以这样调用它,然后使用result - letter获取该位置。

result = StrStr(letter, "b!d");

if(result != NULL) {
  int position = result - letter;
  printf("%d\n", position);
}else {
  printf("-1\n");
}

如果要检查多个出现,可以创建一个指向字母的指针,然后将其设置为等于letter加上位置加1的地址,以检查子串是否稍后在数组中找到。< / p>

pointer = letter;
while((result = StrStr(pointer, "a!c")) != NULL) {
  int position = result - letter;
  pointer = letter + position+1;
  printf("%d\n", position);
}

以下是live示例。