在文本中搜索字符块(单词)

时间:2018-01-09 18:17:32

标签: c string algorithm search

我想在文本中搜索一个字符块(单词) 例如,我有下一个文本" Hello xyz world",我想搜索" xyz",注意单词后面的空格。

// The Text
const char * text = "Hello xyz world";
// The target word
const char * patt = "xyz ";
size_t textLen = strlen(text),
  pattLen = strlen(patt), i, j;

for (i = 0; i < textLen; i++) {
  printf("%c", text[i]);
  for (j = 0; j < pattLen; j++) {
    if (text[i] == patt[j]) {
      printf(" <--");
      break;
    }
  }
  printf("\n");
}

结果必须如下:

但不幸的是,结果如下:

它收集整个文本中的所有相似字符,而不仅仅是目标字符(单词)。

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

你必须在打印之前完成一个完整的子串匹配;在第一遍中标记适用的字符,然后再打印第二遍以打印结果。在您的情况下,您将创建第二个数组,其布尔值对应于第一个数组,如

text =&#34; Hello xyz world&#34 ;; 匹配000000111100000

我假设您可以在线找到基本的子串匹配程序。在第二遍打印很容易:你已经有了逻辑。而不是if (text[i] == patt[j]),只需使用if match[i]

这是否足以提示?

答案 1 :(得分:1)

你应该从头开始检查你的模式的每个字母(而不是检查整个模式)。试试这个(未经测试):

int currIndex = 0;

for (i = 0; i < textLen; i++) {
  printf("%c", text[i]);
  if (text[i] == patt[currIndex]) {
      for (j = 0; j < pattLen; j++) {
          if(text[i+j] != patt[j]){
              continue;
          }
      }
      printf(" <--");
      currIndex++;
      if(currIndex==pattLen)
          currIndex = 0;
  }
  else{
      currIndex = 0;
  }
  printf("\n");
}

注意: 是达到此目的的最佳方法,但最简单的是

注2:此问题应该按原样关闭:

  

寻求调试帮助的问题(&#34;为什么这段代码不起作用?&#34;)必须   包括所需的行为,特定的问题或错误   在问题本身中重现它所需的最短代码。   没有明确问题陈述的问题对其他问题没有用   读者。请参阅:How to create a Minimal, Complete, and Verifiable example.

答案 2 :(得分:1)

在开始打印任何<--之前,您需要确保完全匹配。并且为了避免在patt上通过数组末尾进行访问,当数组中保留少于pattLen个字符时,您将不得不停止搜索。

然后,当您找到完整匹配项后,您可以打印patt的内容,然后打印<--并增加pattLen-1指针的位置。最后,您将不得不从文本中复制剩余的字符。

代码可能变成:

// The Text
const char * text = "Hello xyz world";
// The target word
const char * patt = "xyz ";
size_t textLen = strlen(text),
    pattLen = strlen(patt), i, j;

for (i = 0; i <= textLen - pattLen; i++) {  // don't search if less that pattLen remains
    printf("%c", text[i]);
    if (text[i] == patt[0]) {               // first char matches
        int found = 1;                      // be optimistic...
        for (j = 1; j < pattLen; j++) {
            if (patt[j] != text[i + j]) {
                found = 0;
                break;                      // does not fully match, go on
            }
        }
        if (found) {                        // yeah, a full match!
            printf(" <--");                 // already printed first char
            for (j = 1; j < pattLen; j++) {
                printf("\n%c <--", patt[j]);// print all others chars from patt
            }
            i += pattLen - 1;               // increase index...
        }
    }
    printf("\n");
}
while (i < textLen) {
    printf("%c\n", text[i++]);              // process the end of text
}

以上代码为"xyz "以及"llo" ...

提供了预期的输出