сравнение std::string (проверка, начинается ли строка с другой строки)

StackOverflow https://stackoverflow.com/questions/931827

  •  06-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

Другие советы

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

Я чувствую, что не совсем понимаю ваш вопрос.Кажется, это должно быть тривиально:

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top