我有一个队列fifo类型(先进先出),其中包含字符串。每个字符串都是句子。我需要在其中找到一个单词,并在控制台上显示它。问题是,当我使用str.find(“ word”)时,它可以显示带有“ words”的句子。
添加空格和一些符号,例如“。,?!” = str.find(“ word”)等,但这不是解决方案
if (head != nullptr)
do {
if (head->zdanie_kol.find("promotion") != string::npos ||
head->zdanie_kol.find("discount") != string::npos ||
head->zdanie_kol.find("sale") != string::npos ||
head->zdanie_kol.find("offer") != string::npos)
cout << head->zdanie_kol << endl;
} while (head != nullptr);
例如,我有两个句子,一个是正确的,另一个是不正确的。
正确:
我们为您提供了一个特殊的电子邮件数据库,可让您与eBay会员联系买卖双方。
不正确:
不要失去机会注册并找到我们为您准备的超级促销!
答案 0 :(得分:4)
为此我想到的三个最简单的解决方案是:
'\0'
,则说明您找到了匹配项。请务必先检查一下字符,以免在寻找sword
时与word
不符。另外,请确保您没有在字符串存储之外读取内容。strtok()
进行此操作。regex_match()
)。视您选择的引擎而定,语法可能有所不同,但大多数语法都类似于"\\bsale\\b"
,它将在单词边界上匹配(有关更多信息,请参见here)。答案 1 :(得分:0)
这是使用std::unordered_set
和std::istringstream
的解决方案:
#include <unordered_set>
#include <string>
#include <sstream>
//...
std::unordered_set<std::string> filter_word = {"promotion", "discount", "sale", "offer"};
//...
std::istringstream strm(head->zdanie_kol);
std::string word;
while (strm >> word)
{
if (filter_word(word).count())
{
std::cout << head->zdanie_kol << std::endl;
break;
}
}
//...
如果要检查的单词更多而不是4个单词,那么此解决方案似乎更易于使用,因为您要做的就是将这些单词添加到unordered_set
中。