string::substr в C++: получение частей строк
Привет! В этой статье мы сосредоточимся на полезной функции C++ для работы со строками: substr
. Начнем с обзора этой функции, разберемся, как правильно ее использовать, а затем рассмотрим несколько примеров для того, чтобы лучше ее понять. В конце вы найдете упражнения для закрепления материала.
Как извлечь часть строки в C++
Чтобы взять конкретную часть строки в C++, функция substr
приходит на помощь:
string substr(size_t pos = 0, size_t len = npos) const;
- Функция начинает работать с символа на позиции
pos
. - Она извлекает
len
символов оттуда или берет символы до конца, еслиlen
не указан или если в строке мало символов.
Давайте рассмотрим простой код, где мы используем substr
:
#include <iostream>
#include <string>
using namespace std;
int main() {
string sentence = "abc + def = abcdef";
cout << "Часть строки: " << sentence.substr(6, 3) << endl; // Вывод: def
return 0;
}
В приведенном выше примере программа извлекает “def” из строки. Начиная с позиции 6 (помните, мы начинаем считать с 0), она извлекает 3 символа.
Но что, если мы не укажем длину или укажем значение, превышающее оставшуюся длину строки?
cout << "Извлеченная часть: " << sentence.substr(6) << endl; // Вывод: def = abcdef
В таких случаях substr
просто извлекает все, начиная с начальной позиции до конца строки.
Важные замечания по substr
-
Позиция и длина: Начальная позиция,
pos
, начинается с 0 (а не с 1). Если вы укажете позицию, равную длине строки, вы получите пустую строку. И еслиpos
превысит длину строки, будет вызвано исключениеout_of_range
. -
Тип переменных: Переменные
pos
иlen
имеют типsize_t
, что означает, что они могут содержать только неотрицательные значения. -
Сложность: Время работы
substr
в основном зависит от длины извлекаемого участка. Обычно это быстро, но производительность может различаться в зависимости от компилятора и системы. -
Безопасность: Если вы сделаете что-то, что функция не может обработать, например, запросите позицию за пределами длины строки, будет вызвано исключение. Также будет вызвано исключение
bad_alloc
, если попытка выделения памяти не удастся.