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

  1. Позиция и длина: Начальная позиция, pos, начинается с 0 (а не с 1). Если вы укажете позицию, равную длине строки, вы получите пустую строку. И если pos превысит длину строки, будет вызвано исключение out_of_range.

  2. Тип переменных: Переменные pos и len имеют тип size_t, что означает, что они могут содержать только неотрицательные значения.

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

  4. Безопасность: Если вы сделаете что-то, что функция не может обработать, например, запросите позицию за пределами длины строки, будет вызвано исключение. Также будет вызвано исключение bad_alloc, если попытка выделения памяти не удастся.

Практический пример

Представьте, что вы работаете над программой для извлечения доменных имен из URL. Вот простой подход:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string url = "https://www.example.com/page1";
    size_t start = url.find("www.");
    size_t end = url.find(".com");

    cout << "Домен: " << url.substr(start + 4, end - start - 4) << endl;  // Вывод: example

    return 0;
}

Заключение

Функция substr в C++ полезна во многих ситуациях. Будь то анализ текстов, обработка ввода пользователя или простое разделение строк, знание того, как использовать substr, может упростить ваши задачи по программированию.

Помните, что хотя инструменты, такие как substr, мощные, их необходимо использовать разумно. Всегда учитывайте возможные исключения и понимайте нюансы, чтобы избежать подводных камней. Удачного программирования!

Упражнения

  1. Основное применение substr:

    • Создайте программу на C++, которая предлагает пользователю ввести предложение.
    • Запросите у пользователя начальную позицию и длину.
    • Используйте функцию substr, чтобы извлечь часть предложения пользователя на основе их ввода и отобразить результат.
    • Примечание: Убедитесь, что обрабатываете возможные исключения или ошибки на основе информации из статьи.
  2. Обработка исключений:

    • Измените программу из первого задания.
    • Внесите намеренные ошибки, такие как указание позиции за пределами длины строки.
    • Реализуйте механизмы обработки исключений для перехвата любых исключений out_of_range или bad_alloc, отображая соответствующее сообщение об ошибке пользователю.
  3. Извлечение доменных имен, определенных пользователем:

    • Создайте программу на C++, где пользователь предоставляет URL.
    • Попросите пользователя указать начальные и конечные ключевые слова домена (например, “www.” и “.com”).
    • Используйте функцию substr в сочетании с функцией find, чтобы извлечь и отобразить имя домена.
    • Убедитесь, что обрабатываете любые потенциальные ошибки или несоответствия в пользовательском вводе.

Обсуждение