Мне нужно проверить, начинается ли std:string с «xyz». Как мне это сделать без поиска по всей строке или создания временных строк с помощью substr().
Сравнение std::string (проверить, начинается ли строка с другой строки)
Ответы (5)
Я бы использовал метод сравнения:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Подход, который может больше соответствовать духу Стандартной библиотеки, заключается в определении собственного алгоритма begin_with.
#include <algorithm>
using namespace std;
template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
return input.size() >= match.size()
&& equal(match.begin(), match.end(), input.begin());
}
Это обеспечивает более простой интерфейс для клиентского кода и совместимо с большинством контейнеров стандартной библиотеки.
Обратитесь к библиотеке Boost String Algo, в которой есть ряд полезных функций, таких как startup_with, istart_with (без учета регистра) и т. д. Если вы хотите использовать в своем проекте только часть библиотек boost, то вы можете использовать утилиту bcp для копирования только необходимых файлов
Кажется, что std::string::starts_with находится внутри C++20, между тем можно использовать std::string::find
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
, поскольку позволяет легко проверить, начинается ли строка с литерала, не повторяя сам литерал, чтобы найти его размер. И спасибо за указание на прямое решение C++20.
- person Ruslan; 10.09.2019
Я чувствую, что не совсем понимаю ваш вопрос. Похоже, это должно быть тривиально:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Это касается только (максимум) первых трех символов. Обобщение для строки, которая неизвестна во время компиляции, потребует от вас замены приведенного выше цикла:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.
- person Jim Balter; 06.11.2014