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