在c中匹配一个确切的单词

时间:2017-02-20 19:32:20

标签: c strstr

我可以使用strstr函数匹配确切的单词吗?例如,我们说我有单词hello和输入字符串line

如果

char* line = "hellodarkness my old friend";

我用

result = strstr(line, "hello");

result将匹配(不是NULL),但我想只匹配确切的单词" hello" (这样" hellodarkness"将不匹配)并且结果将为NULL。 可以使用strstr执行此操作,还是必须使用fscan并逐字扫描并检查匹配项?

3 个答案:

答案 0 :(得分:5)

这是一个适合您目的的通用功能。它返回指向第一个匹配的指针,如果找不到,则返回NULL

#include <ctype.h>
#include <string.h>

char *word_find(const char *str, const char *word) {
    const char *p = NULL;
    size_t len = strlen(word);

    if (len > 0) {
        for (p = str; (p = strstr(p, word)) != NULL; p++) {
            if (p == str || !isalnum((unsigned char)p[-1])) {
                if (!isalnum((unsigned char)p[len]))
                    break;  /* we have a match! */
                p += len;   /* next match is at least len+1 bytes away */ 
            }
        }
    }
    return p;
}

答案 1 :(得分:4)

我会:

  • 检查字符串是否在句子中
  • 如果在开始时找到(与line相同的指针),请添加单词的长度并检查是否找到了字母数字字符。如果不是(或以null结尾),则匹配
  • 如果在其他地方找到,请在&#34;之前添加额外的&#34; no alphanum。测试

代码:

#include <stdio.h>
#include <strings.h>
#include <ctype.h>
int main()
{
  const char* line = "hellodarkness my old friend";
  const char *word_to_find = "hello";
  char* p = strstr(line,word_to_find);
  if ((p==line) || (p!=NULL && !isalnum((unsigned char)p[-1])))
  {
     p += strlen(word_to_find);
     if (!isalnum((unsigned char)*p))
     {
       printf("Match\n");
     }
  }
  return 0;
}

这里它不会打印任何东西,但是在"hello"之后插入一个标点符号/空格,或者在"hello"之后终止该字符串,然后你就会得到一个匹配项。此外,您通过在 hello之前插入alphanum chars 来赢得比赛。

编辑:当只有{1} "hello"但未找到"hellohello hello"中的第二个NULL时,上面的代码很不错。所以我们必须插入一个循环来查找单词或p,每次都推进#include <stdio.h> #include <strings.h> #include <ctype.h> int main() { const char* line = " hellohello hello darkness my old friend"; const char *word_to_find = "hello"; const char* p = line; for(;;) { p = strstr(p,word_to_find); if (p == NULL) break; if ((p==line) || !isalnum((unsigned char)p[-1])) { p += strlen(word_to_find); if (!isalnum((unsigned char)*p)) { printf("Match\n"); break; // found, quit } } // substring was found, but no word match, move by 1 char and retry p+=1; } return 0; } ,如下所示:

{{1}}

答案 2 :(得分:3)

由于static void Main(string[] args) { Console.WriteLine("u up"); Console.WriteLine("h home"); Console.WriteLine("x exit"); Console.WriteLine("---------------------------------"); Console.WriteLine(" [Enter Your Selection]"); Console.WriteLine("---------------------------------"); Console.Write("Enter Selection: "); ConsoleKeyInfo selection; Console.TreatControlCAsInput = true; int value; selection = Console.ReadKey(); if (char.IsDigit(selection.KeyChar)) { value = int.Parse(selection.KeyChar.ToString()); value -= 1; Console.WriteLine("You've entered {0}", value); } else { switch (selection.Key) { case ConsoleKey.U: blurp(); break; case ConsoleKey.H: blurp(); break; case ConsoleKey.X: System.Environment.Exit(0); break; default: Console.WriteLine("Invalid Input..."); break; } } } public static void blurp() { Console.WriteLine(""); Console.Write("Enter Another Value: "); string value = Console.ReadLine(); Console.WriteLine("You've entered {0}", value); } 返回指向您要识别的子字符串起始位置的指针,因此您可以使用strstr()检查它是否是较长字符串的子字符串或您所隔离的字符串正在找。如果strlen(result),则它正确结束。如果它以空格或标点符号(或其他一些分隔符)结尾,那么它也会在末尾被隔离。您还需要检查子串的开头是否在&#34;长字符串的开头#34;或者在空格,标点符号或其他分隔符之前。