在c语言中使用精确匹配词
我可以使用strstr函数来匹配精确的单词吗?例如,假设我有单词在c语言中使用精确匹配词,c,strstr,C,Strstr,我可以使用strstr函数来匹配精确的单词吗?例如,假设我有单词hello,还有一个输入字符串行: 如果 我用 result = strstr(line, "hello"); result将匹配(不为NULL),但是我只想匹配确切的单词“hello”(因此“hellodarkness”将不匹配),结果将为NULL。 是否可以使用strstr执行此操作,还是必须使用fscan逐字扫描行并检查匹配项?我会: 检查字符串是否在句子中 如果在开始处找到(与行相同的指针),请添加单词的长度,并检查是否
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 checkIf(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。。。但是匹配应该是有效的(一个完整的单词匹配)。@Dmitristrlen()
检查它在子字符串之后结束的可能性。如果它们不相等,则检查是否有空格或其他分隔符。我只是不喜欢将空字符作为分隔符检查的一部分。如果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;
}