C++ 如何搜索准确的单词?

C++ 如何搜索准确的单词?,c++,string,C++,String,我很好奇,是否有一种方法可以自己找到一个确切的单词,即使搜索是在一个单词中进行的。正如您在下面看到的,输出表明单词“day”被找到了两次,但这只是因为“day”也用于拼写“today”。我希望搜索能够特别查找“day”一词,并计算它的数量,即使它是在“today”中找到的 这可能吗 注意:任务要求我们使用字符串操纵器 如果找到一个单词,可以使用std::isalpha检查相邻字符是否为字母表,并且仅当它们不是字母表时才进行计数 while (( pos = userParagraph.find(

我很好奇,是否有一种方法可以自己找到一个确切的单词,即使搜索是在一个单词中进行的。正如您在下面看到的,输出表明单词“day”被找到了两次,但这只是因为“day”也用于拼写“today”。我希望搜索能够特别查找“day”一词,并计算它的数量,即使它是在“today”中找到的

这可能吗

注意:任务要求我们使用字符串操纵器


如果找到一个单词,可以使用std::isalpha检查相邻字符是否为字母表,并且仅当它们不是字母表时才进行计数

while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    if ((pos == 0 || !std::isalpha(userParagraph[pos - 1]))
        && (pos + searchWord.size() == userParagraph.size() 
           || !std::isalpha(userParagraph[pos + searchWord.size()]))
         ++wordCount;
    
    ++pos;  
}
现在这个词如果是另一个词的一部分就不算了


请注意,需要进行额外的检查,以确保不会索引到字符串的无效位置。

如果找到一个单词,可以使用std::isalpha检查相邻字符是否为字母表,并且仅当它们不是字母表时才进行计数

while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    if ((pos == 0 || !std::isalpha(userParagraph[pos - 1]))
        && (pos + searchWord.size() == userParagraph.size() 
           || !std::isalpha(userParagraph[pos + searchWord.size()]))
         ++wordCount;
    
    ++pos;  
}
现在这个词如果是另一个词的一部分就不算了


请注意,需要进行额外的检查,以确保不会索引到字符串的无效位置。

是的,这是可能的。但它需要你决定什么是词的边界。例如,“-”一词的边界像一个空格吗?或者你会把它当作一封信吗? 例如,您可以通过检查找到的字符串:

以新词开头,即我们位于字符串的开头,或者前面的字符不是字母,并且 以单词结尾,即要么到达字符串的最后一个字符,要么下一个字符不是后一个字符。 看起来是这样的:

while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    bool wstart = pos==0 || !isalpha(userParagraph[pos-1]);
    bool wend = pos+searchWord.size()==userParagraph.size() 
            || !isalpha(userParagraph[pos+searchWord.size()]);
    if (wstart && wend)
        ++wordCount;

    ++pos;
}

注意:这仅适用于单字符编码。使用UTF8时,使用ascii字母表中不包含的字母的语言(例如重音字母,如é、ñ、ä等)将无法使用UTF8。。。将被误解为有效的分词符是的,这是可能的。但它需要你决定什么是词的边界。例如,“-”一词的边界像一个空格吗?或者你会把它当作一封信吗? 例如,您可以通过检查找到的字符串:

以新词开头,即我们位于字符串的开头,或者前面的字符不是字母,并且 以单词结尾,即要么到达字符串的最后一个字符,要么下一个字符不是后一个字符。 看起来是这样的:

while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    bool wstart = pos==0 || !isalpha(userParagraph[pos-1]);
    bool wend = pos+searchWord.size()==userParagraph.size() 
            || !isalpha(userParagraph[pos+searchWord.size()]);
    if (wstart && wend)
        ++wordCount;

    ++pos;
}

注意:这仅适用于单字符编码。使用UTF8时,使用ascii字母表中不包含的字母的语言(例如重音字母,如é、ñ、ä等)将无法使用UTF8。。。将被误解为有效的分词符

只需检查找到位置前后的字符是否为空格、标点符号等。查找的解决方案将包含在搜索本身中。应该说得更清楚@olafdietsche是否允许使用正则表达式搜索?我想不是。你也可以这样做。只需检查找到的位置前后的字符是否为空格、标点符号等。你正在寻找一个将包含在搜索本身中的解决方案。应该说得更清楚@olafdietsche是否允许使用正则表达式搜索?我想不是。你也可以那样做。