Функция 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;
}
}