сравнение std :: string (проверьте, начинается ли строка с другой строки) - PullRequest
89 голосов
/ 31 мая 2009

Мне нужно проверить, начинается ли строка std: с "xyz". Как мне сделать это без поиска по всей строке или создания временных строк с помощью substr ().

Ответы [ 5 ]

161 голосов
/ 31 мая 2009

Я бы использовал метод сравнения:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}
13 голосов
/ 15 мая 2013

Подход, который мог бы больше соответствовать духу Стандартной библиотеки, заключался бы в определении собственного алгоритма 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());
}

Это обеспечивает более простой интерфейс с клиентским кодом и совместимо с большинством контейнеров стандартной библиотеки.

10 голосов
/ 31 мая 2009

Просмотрите библиотеку Boost's String Algo , в которой есть ряд полезных функций, таких как start_with, istart_with (без учета регистра) и т. Д. Если вы хотите использовать в своем проекте только часть библиотек boost , затем вы можете использовать утилиту bcp для копирования только необходимых файлов

2 голосов
/ 04 июля 2018

Кажется, что std :: string :: start_with находится внутри C ++ 20, тогда как std :: string :: find может использоваться

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}
0 голосов
/ 31 мая 2009

Мне кажется, я не до конца понимаю ваш вопрос. Выглядит так, как будто это должно быть тривиально:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...