Есть ли альтернатива str.find в c ++? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть тип очереди fifo (первым пришел, первым вышел) со строками в нем.Каждая строка является предложением.Мне нужно найти слово в нем и показать его на консоли.Проблема в том, что когда я использовал str.find («слово»), он может показывать предложение со «словами».

Добавьте пробел и некоторые символы, такие как ".,?!"= 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 как продавцами, так и покупателями.

Неправильно:

Не упустите свой шанс зарегистрироваться и найти супер акции, которые мы подготовили для вас!

Ответы [ 2 ]

4 голосов
/ 23 мая 2019

Три самых простых решения, которые я могу придумать для этого:

  1. Как только вы получите результат, просто проверьте следующий символ. Если это пробел или '\0', вы нашли свой матч. Не забудьте проверить символ раньше, чтобы не совпадать с sword при поиске word. Также убедитесь, что вы не читаете за пределами памяти строк.
  2. Сначала токенизируйте строку. Это разобьет предложение на слова, и вы сможете проверить слово за словом, чтобы увидеть, соответствует ли оно. Вы можете сделать это с помощью strtok().
  3. Используйте регулярное выражение (например, regex_match()), как указано в комментариях. В зависимости от выбранного вами механизма синтаксис может отличаться, но большинство из них имеют что-то вроде "\\bsale\\b", которое будет соответствовать границе слова (см. здесь для получения дополнительной информации).
0 голосов
/ 23 мая 2019

Вот решение, использующее 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.

...