我可以使用strstr函数匹配确切的单词吗?例如,我们说我有单词hello
和输入字符串line
:
如果
char* line = "hellodarkness my old friend";
我用
result = strstr(line, "hello");
result
将匹配(不是NULL),但我想只匹配确切的单词" hello" (这样" hellodarkness"将不匹配)并且结果将为NULL。
可以使用strstr
执行此操作,还是必须使用fscan
并逐字扫描并检查匹配项?
答案 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结尾),则匹配代码:
#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;或者在空格,标点符号或其他分隔符之前。