Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中使用精确匹配词_C_Strstr - Fatal编程技术网

在c语言中使用精确匹配词

在c语言中使用精确匹配词,c,strstr,C,Strstr,我可以使用strstr函数来匹配精确的单词吗?例如,假设我有单词hello,还有一个输入字符串行: 如果 我用 result = strstr(line, "hello"); result将匹配(不为NULL),但是我只想匹配确切的单词“hello”(因此“hellodarkness”将不匹配),结果将为NULL。 是否可以使用strstr执行此操作,还是必须使用fscan逐字扫描行并检查匹配项?我会: 检查字符串是否在句子中 如果在开始处找到(与行相同的指针),请添加单词的长度,并检查是否

我可以使用strstr函数来匹配精确的单词吗?例如,假设我有单词
hello
,还有一个输入字符串

如果

我用

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

我会:

  • 检查字符串是否在句子中
  • 如果在开始处找到(与
    相同的指针),请添加单词的长度,并检查是否找到字母数字字符。如果不是(或以null结尾),则匹配
  • 如果在其他地方找到,则添加额外的“no alphanum before”测试
代码:


由于
strstr()
返回指向要标识的子字符串起始位置的指针,因此可以使用
strlen(result)
检查它是较长字符串的子字符串还是要查找的孤立字符串。如果strlen(result)=strlen(“hello”),则正确结束。如果它以空格或标点符号(或其他分隔符)结尾,那么它也会在结尾处被隔离。您还需要检查子字符串的开头是否位于“长字符串”的开头,或者前面是否有空格、标点符号或其他分隔符。

这是一个通用函数。它返回指向第一个匹配项的指针,如果找不到,则返回
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;
}
#包括
#包括
char*word\u find(常量char*str,常量char*word){
const char*p=NULL;
尺寸长度=标准长度(字);
如果(len>0){
for(p=str;(p=strstrstr(p,word))!=NULL;p++){
if(p==str | |!isalnum((无符号字符)p[-1])){
if(!isalnum((无符号字符)p[len]))
休息;/*我们有一场比赛*/
p+=len;/*下一个匹配距离至少为len+1字节*/
}
}
}
返回p;
}

strstr()
返回指向匹配项的指针,而不仅仅是true或false。。。如果找到匹配项,只需检查前后的字符是否为字母(或字母数字,如果您愿意)--如果不是,则表示您已获得有效匹配项,如果是,请从刚过返回指针的位置重试。解释它的行为。它所做的只是寻找一个字符串作为另一个字符串的子字符串的出现。如果找到这样的子字符串,
strstr()
本身不传递有关子字符串外观周围字符的信息,但您可以自己查看。如果字符不是字符串的开头,还需要在匹配之前检查字符。@Jean-Françoisfare check
If(p==line)
,然后
if(!isalnum(p-1))
,然后
strlen(p)
,然后
if(!isalnum(p+strlen(word-to-find))
并且您已经检查了所有的可能性。否:如果
p
为NULL则
isalnum(p[-1])
将读取错误的内存。假设p不是NULL(找到匹配项)。然后检查p是否是行的起点(因此p-1无效)。如果p不是行起始(因此p-1有效),则检查它是否是分隔符(
!isalnum()
)。这类似于检查结尾的方式。我很抱歉在括号中插入括号。我打字太快了……但是
strlen()
会很高兴地继续输入单词,即使后面的字符不是字母数字,那么这有什么帮助呢?@Dmitri我在帖子中添加了必要的分隔符检查参考。我打字太快了,漏掉了下一句我本想输入的句子。
char*hs=“hello”、*str=“hello world”;char*x=strstrstr(hs,str)。。。然后
strlen(x)
是11,而
strlen(hs)
只有5。。。但是匹配应该是有效的(一个完整的单词匹配)。@Dmitri
strlen()
检查它在子字符串之后结束的可能性。如果它们不相等,则检查是否有空格或其他分隔符。我只是不喜欢将空字符作为分隔符检查的一部分。如果
strlen()
不匹配,我会说检查空格或其他分隔符。
#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;
}
#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;
}
#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;
}