Получение подстроки и проверка начала и конца строки

Последнее обновление: 02.03.2023

Получение подстроки

Функция substr() получает подстроку. Эта функция принимает два параметра. Первый параметр представляет индекс, с которого начинается подстрока. Второй параметр - количество символов извлекаемой подстроки. Результатом функции является выделенная строка:

#include <iostream>
#include <string>

int main()
{
    std::string message{ "tom@localhost.com"};
    std::string submessage = message.substr(4, 9); // 9 символов начиная с 4-го 
    std::cout << submessage << std::endl;   // localhost
}

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

std::string message{ "tom@localhost.com"};
std::string submessage = message.substr(4, 20); // localhost.com

Другая ситуация - начальный индекс подстроки недействителен - равен или больше количества символов:

std::string message{ "tom@localhost.com"};
std::string submessage = message.substr(24, 20); // ! Ошибка

В этом случае мы столкнемся с исключением std::out_of_range, и программа аварийно завершит выполнение.

Если надо извлечь все символы начиная с какого-то определенного, то можно использовать другую форму функции substr(), которая принимает только начальный индекс:

std::string message{ "tom@localhost.com"};
std::string submessage = message.substr(4); // localhost.com

Проверка начала и завершения строки

Иногда возникает необходимость проверить, начинается ли строка на определенную подстроку. В принципе для этой цели можно использовать и ранее рассмотренные функции compare() и substr(). Например:

#include <iostream>
#include <string>

int main()
{
    std::string text {"hello world!"};
    std::string hello {"hello"};

    // проверка, начинаяется ли text на строку hello
    // с помощью функции compare
    if (text.compare(0, hello.length(), hello) == 0)
    {
        std::cout << "The text starts with " << hello << std::endl;
    }
    // с помощью функции substr
    if (text.substr(0, hello.length()) == hello)
    {
        std::cout << "The text starts with " << hello << std::endl;
    }
}

Однако начиная со стандарта C++20 таже можно использовать функцию starts_with(). Если текущая строка начинается на другую строку, то функция возвращает true:

#include <iostream>
#include <string>

int main()
{
    std::string text {"hello world!"};
    std::string hello {"hello"};

    // проверка, начинаяется ли text на строку hello
    if (text.starts_with(hello))
    {
        std::cout << "The text starts with " << hello << std::endl;
    }
}

Аналогично с помощью функций compare() и substr() можно проверить, завершается ли текст на определенную подстроку. Например:

#include <iostream>
#include <string>

int main()
{
    std::string text {"hello world"};
    std::string world {"world"};

    // конченый индекс
    unsigned end = text.length() - world.length();
    // проверка, заканчивается ли text на строку world
    if (text.compare(end, world.length(), world) == 0)
    {
        std::cout << "The text ends with " << world << std::endl;
    }
    // с помощью функции substr
    if (text.substr(end, world.length()) == world)
    {
        std::cout << "The text ends with " << world << std::endl;
    }
}

Но в стандарт C++20 для этой цели была специально добавлена функцию ends_with(). Если текущая строка заканчивается на другую строку, то функция возвращает true:

#include <iostream>
#include <string>

int main()
{
    std::string text {"hello world"};
    std::string world {"world"};

    // проверка, начинаяется ли text на строку world
    if (text.ends_with(world))
    {
        std::cout << "The text ends with " << world << std::endl;
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850