【问题标题】:Finding substring in a char[] with wildcard character使用通配符在 char[] 中查找子字符串
【发布时间】:2016-01-20 18:19:09
【问题描述】:

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

例子:

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

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

【问题讨论】:

  • 寻找下一个感叹号,找到后添加一个到迭代器,...
  • 如果用户输入bca,输出会是什么?
  • 您能否发布任何代码,其中您的输入匹配数组没有通配符?以及使用通配符时的后续尝试?如果您已经迈出了第一步,您肯定会正确地发布大数组letter 吗?

标签: c arrays substring wildcard


【解决方案1】:

您可以实现自己的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 的地址加上位置加一,以检查是否稍后在数组中找到子字符串。

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

这是一个live 示例。

【讨论】:

  • 应该if (!*target) return strif (!*target) return p1 (在颠倒两个语句之后)以避免编译器警告?甚至return NULL?还是该函数返回一个索引或 -1 会更好,以满足问题而不修改返回的指针?
  • @WeatherVane 可能,否则会给出错误的输出。
  • result - 字母给出了位置,但是如果稍后在数组中找到目标,我将如何循环呢?我尝试使用一段时间(结果!= NULL),但它仍然只提供一个位置
  • @Rain74 那是因为你只调用 StrStr 一次。你像while((result = StrStr(letter, "b!d")) != NULL) {一样重写你的循环,然后在while循环中用position+1增加letterletter += position+1。这样,如果多次找到“b!d”,您将不会获得相同的位置。
  • @Linus 我试过这样做,但它给了我一个无限循环,并不断打印一个答案:“元素在 60 处找到”无限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多