Как я могу узнать, заканчивается ли строка другой строкой в C ++?
270
Просто сравните последние n символов, используя std::string::compare
:
#include <iostream>
bool hasEnding (std::string const &fullString, std::string const &ending) {
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
int main () {
std::string test1 = "binary";
std::string test2 = "unary";
std::string test3 = "tertiary";
std::string test4 = "ry";
std::string ending = "nary";
std::cout << hasEnding (test1, ending) << std::endl;
std::cout << hasEnding (test2, ending) << std::endl;
std::cout << hasEnding (test3, ending) << std::endl;
std::cout << hasEnding (test4, ending) << std::endl;
return 0;
}
Используйте эту функцию:
источник
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
в режиме отладки он выдает:_DEBUG_ERROR("string iterator not decrementable");
Используйте
boost::algorithm::ends_with
(см., Например, http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):источник
Обратите внимание, что начиная с c ++ 20 std :: string в конечном итоге предоставит start_with и end_with . Похоже, что есть шанс, что с ++ 30 строки в с ++ могут наконец стать пригодными для использования, если вы не читаете это из далекого будущего, вы можете использовать эти startWith / EndWith:
и некоторые дополнительные вспомогательные перегрузки:
IMO, строки c ++ явно не функционируют и не предназначены для использования в реальном коде. Но есть надежда, что это станет лучше, по крайней мере.
источник
Я знаю вопрос о C ++, но если кому-то нужна хорошая старомодная функция C, чтобы сделать это:
источник
std::mismatch
Метод может служить этой цели , когда используется для задом наперед итерации с конца обеих строк:источник
std::equal
: вам нужно заранее проверить, что предполагаемый суффикс не длиннее строки, в которой вы его ищете. Пренебрежение проверкой приводит к неопределенному поведению.На мой взгляд, самое простое решение C ++ это:
источник
s
а не просто проверять ее конец!std::string::size()
- операция с постоянным временем; это не нужноstrlen
.Позвольте
a
быть строкой иb
строкой, которую вы ищете. Используйте,a.substr
чтобы получить последние n символовa
и сравнить их с b (где n - длинаb
)Или использовать
std::equal
(включить<algorithm>
)Пример:
источник
Позвольте мне расширить решение Джозефа с учетом версии без учета регистра ( онлайн-демонстрация )
источник
то же самое, что и выше, вот мое решение
источник
starts_with
используется строка :: сравнить? Почему нетstd::equal(start.begin(), start.end(), str.begin())
?Другой вариант - использовать регулярные выражения. Следующий код делает поиск нечувствительным к верхнему / нижнему регистру:
Вероятно, не так эффективно, но легко реализовать.
источник
ты можешь использовать string :: rfind
Полный пример на основе комментариев:
источник
Проверьте, есть ли суффикс str , используя ниже:
источник
Используйте алгоритм std :: equal
<algorithms>
с обратной итерацией:источник
Относительно ответа Гжегожа Базиора. Я использовал эту реализацию, но оригинальная имеет ошибку (возвращает true, если я сравниваю «..» с «.so»). Я предлагаю модифицированную функцию:
источник
Я думал, что имеет смысл опубликовать сырое решение, которое не использует библиотечные функции ...
Добавив простой,
std::tolower
мы можем сделать этот регистр нечувствительнымисточник
Нашел этот хороший ответ на похожую проблему "startWith":
Как проверить, начинается ли строка C ++ std :: string с определенной строки, и преобразовать подстроку в int?
Вы можете принять решение, чтобы искать только в последнем месте в строке:
Таким образом, вы можете сделать его коротким, быстрым, использовать стандартный c ++ и сделать его читабельным.
источник
Если вы похожи на меня и не любите C ++, то вот вам старый гибрид скула. Есть некоторое преимущество, когда строки больше, чем несколько символов, как большинство
memcmp
реализаций сравнивают машинные слова, когда это возможно.Вы должны контролировать набор символов. Например, если этот подход используется с типом utf-8 или wchar, есть некоторый недостаток, поскольку он не поддерживает сопоставление символов - например, когда два или более символов логически идентичны .
источник
Мои два цента:
источник