在具有通配符的 char[] 中查找子字符串

Finding substring in a char[] with wildcard character

我有一个字符数组,一旦用户输入一串字符,我的程序就需要在我的大字符数组中找到这串字符并报告其索引。但是,如果有一个通配符,例如 !,这将代表我的数组中的任何字符,我如何让我的程序将 ! 读取为任何字母?

示例:

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

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

您可以实现自己的 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;
}

这将简单地测试是否在 str 中找到 target 并将比较每个字符。如果字符是感叹号,如果它们不同,它将忽略。

你可以这样调用,然后用result - letter获取位置。

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

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

如果你想检查多次出现,你可以创建一个指向字母的指针,然后将其设置为等于 letter 的地址加上位置加一,以检查稍后是否在数组中找到子字符串.

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

这是一个 live 示例。