Arkadiusz Szumny
Arkadiusz Szumny

Reputation: 1

Is there alternative str.find in c++?

I have got a queue fifo type (first in, first out) with strings in it. Every string is sentence. I need to find a word in it, and show it on console. The problem is, that when i used str.find("word") it can showed sentence with "words".

Add white space and some symbols like ".,?!" = str.find("word ") etc. but its not a solution

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);

For example, i got two sentences, one is correct, another one is not.

Correct:

We have a special OFFER for you an email database which allows to contact eBay members both sellers and shoppers.

Not Correct:

Do not lose your chance sign up and find super PROMOTIONS we prepared for you!

Upvotes: 0

Views: 1361

Answers (2)

PaulMcKenzie
PaulMcKenzie

Reputation: 35440

Here is a solution, using std::unordered_set and 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;
    }
}  
//...

If you had many more words to check instead of only 4 words, this solution seems easier to use since all you have to do is add those words to the unordered_set.

Upvotes: 0

kichik
kichik

Reputation: 34704

The three simplest solutions I can think of for this are:

  1. Once you get the result simply check the next character. If it's a whitespace or '\0', you found your match. Make sure to check the character before too so you don't match sword when looking for word. Also make sure you're not reading beyond the string memory.
  2. Tokenize the string first. This will break the sentence into words and you can then check word by word to see if it matches. You can do this with strtok().
  3. Use regular expression (e.g. regex_match()) as mentioned in the comments. Depending on the engine you choose, the syntax may differ, but most of them have a something like "\\bsale\\b" which will match on word boundary (see here for more information).

Upvotes: 4

Related Questions