Здесь много факторов, например:
- тебя волнует пустое пространство? например может ли быть несколько пробелов между "собака" и "есть"?
- тебя волнует дело?
- какой уровень производительности вам нужен?
Самый гибкий подход - использовать регулярные выражения. Boost имеет реализацию, как и многие популярные операционные системы (например, Linux man regexp et al). Проверка на совпадение с чем-то вроде «^ ([AZ] +) \ s + is \ s + a \ s + kind \ s + of \ s + animal \ s $», где заключенное в скобки подвыражение (тип животного) может быть извлечен с помощью библиотеки регулярных выражений, а затем искать в массиве. Вы можете использовать сравнение без учета строк. Это предполагает, что список поддерживаемых животных читается из какого-то внешнего источника во время выполнения. Как предполагает bdonlan - если он известен заранее, вы можете жестко закодировать его в регулярном выражении (dog|cat|...)
.
Вы можете предварительно отсортировать массив и использовать бинарный поиск: в STL C ++ уже есть алгоритмы сортировки и поиска. Это будет немного быстрее, чем заполнение std::set
списком животных, но тогда вам может быть наплевать на разницу в скорости.
Другой подход - сканирование с потоками C ++:
std::string what, is, a, kind, of, animal;
char unwanted;
std::istringstream input(" Dog is a kind of animal");
if ((input >> what >> is >> a >> kind >> of >> animal) &&
!(input >> unwanted) &&
is == "is" && a == "a" && kind == "kind" && of == "of" && animal == "animal")
{
// match!
}
Вы можете сделать что-то похожее с sscanf, что требует осторожности с указателями и не читает слишком много символов, но также более эффективно:
char what[21];
if (sscanf(candidate, "%.20[A-Za-z] is a kind of animal %c", what, &unwanted) == 1)
// match...