Основы работы со строками в C++
В языке C++ для удобной работы со строками есть класс string, для использования которого необходимо подключить заголовочный файл string.
Строки можно объявлять и одновременно присваивать им значения:
string S1, S2 = «Hello»;
Строка S1 будет пустой, строка S2 будет состоять из 5 символов.
К отдельным символам строки можно обращаться по индексу, как к элементам массива или C-строк. Например S[0] — это первый символ строки.
Для того, чтобы узнать длину строки можно использовать метод size() строки. Например, последний символ строки S это S[S.size() — 1 ].
Строки в языке C++ могут
Конструкторы строк
Строки можно создавать с использованием следующих конструкторов:
string() — конструктор по умолчанию (без параметров) создает пустую строку.
string(string & S) — копия строки S
string( size_t n, char c) — повторение символа c заданное число n раз.
string(size_t c) — строка из одного символа c .
string(string & S, size_t start, size_t len) — строка, содержащая не более, чем len символов данной строки S , начиная с символа номер start .
Конструкторы можно вызывать явно, например, так:
В этом примере явно вызывается конструктор string для создания строки, состоящей из 10 символов ‘z’ .
Неявно конструктор вызывается при объявлении строки с указанием дополнительных параметров. Например, так:
Подробней о конструкторах для строк читайте здесь.
Ввод-вывод строк
Строка выводится точно так же, как и числовые значения:
Для считывания строки можно использовать операцию «>>» для объекта cin:
В этом случае считывается строка из непробельных символов, пропуская пробелы и концы строк. Это удобно для того, чтобы разбивать текст на слова, или чтобы читать данные до конца файла при помощи while (cin >> S) .
Можно считывать строки до появления символа конца строки при помощи функции getline. Сам символ конца строки считывается из входного потока, но к строке не добавляется:
Арифметические операторы
Со строками можно выполнять следующие арифметические операции:
= — присваивание значения.
+= — добавление в конец строки другой строки или символа.
+ — конкатенация двух строк, конкатенация строки и символа.
== , != — посимвольное сравнение.
< , >, = — лексикографическое сравнение.
То есть можно скопировать содержимое одной строки в другую при помощи операции S1 = S2, сравнить две строки на равенство при помощи S1 == S2, сравнить строки в лексикографическом порядке при помощи S1 < S2, или сделать сложение (конкатенацию) двух строк в виде S = S1 + S2.
Подробней об операторах для строк читайте здесь.
Методы строк
У строк есть разные методы, многие из них можно использовать несколькими разными способами (с разным набором параметров).
Рассмотрим эти методы подробней.
size
Метод size() возращает длину длину строки. Возвращаемое значение является беззнаковым типом (как и во всех случаях, когда функция возращает значение, равное длине строке или индексу элемента — эти значения беззнаковые). Поэтому нужно аккуратно выполнять операцию вычитания из значения, которое возвращает size(). Например, ошибочным будет запись цикла, перебирающего все символы строки, кроме последнего, в виде for (int i = 0; i < S.size() - 1; ++i).
Кроме того, у строк есть метод length(), который также возвращает длину строки.
Подробней о методе size.
resize
S.resize(n) — Изменяет длину строки, новая длина строки становится равна n. При этом строка может как уменьшится, так и увеличиться. Если вызвать в виде S.resize(n, c) , где c — символ, то при увеличении длины строки добавляемые символы будут равны c.
Подробней о методе resize.
clear
S.clear() — очищает строчку, строка становится пустой.
Подробней о методе clear.
empty
S.empty() — возвращает true, если строка пуста, false — если непуста.
Подробней о методе empty.
push_back
S.push_back(c) — добавляет в конец строки символ c, вызывается с одним параметром типа char.
Подробней о методе push_back.
append
Добавляет в конец строки несколько символов, другую строку или фрагмент другой строки. Имеет много способов вызова.
S.append(n, c) — добавляет в конец строки n одинаковых символов, равных с. n имеет целочисленный тип, c — char.
S.append(T) — добавляет в конец строки S содержимое строки T. T может быть объектом класса string или C-строкой.
S.append(T, pos, count) — добавляет в конец строки S символы строки T начиная с символа с индексом pos количеством count.
Подробней о методе append.
erase
S.erase(pos) — удаляет из строки S с символа с индексом pos и до конца строки.
S.erase(pos, count) — удаляет из строки S с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().
Подробней о методе erase.
insert
Вставляет в середину строки несколько символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первым параметром является значение i — позиция, в которую вставляются символы. Первый вставленный символ будет иметь индекс i, а все символы, которые ранее имели индекс i и более сдвигаются вправо.
S.insert(i, n, c) — вставить n одинаковых символов, равных с. n имеет целочисленный тип, c — char.
S.insert(i, T) — вставить содержимое строки T. T может быть объектом класса string или C-строкой.
S.insert(i, T, pos, count) — вставить символы строки T начиная с символа с индексом pos количеством count.
Подробней о методе insert.
substr
S.substr(pos) — возвращает подстроку данной строки начиная с символа с индексом pos и до конца строки.
S.substr(pos, count) — возвращает подстроку данной строки начиная с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().
Подробней о методе substr.
replace
Заменяет фрагмент строки на несколько равных символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первыми двумя параметрами являются два числа: pos и count. Из данной строки удаляется count символов, начиная с символа pos, и на их место вставляются новые символы.
S.replace(pos, count, n, c) — вставить n одинаковых символов, равных с. n имеет целочисленный тип, c — char.
S.replace(pos, count, T) — вставить содержимое строки T. T может быть объектом класса string или C-строкой.
S.replace(pos, count, T, pos2, count2) — вставить символы строки T начиная с символа с индексом pos количеством count.
Подробней о методе replace.
find
Ищет в данной строке первое вхождение другой строки str. Возвращается номер первого символа, начиная с которого далее идет подстрока, равная строке str. Если эта строка не найдена, то возвращается константа string::npos (которая равна -1, но при этом является беззнаковой, то есть на самом деле является большим безннаковым положительным числом).
Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.
S.find(str, pos = 0) — искать первое входение строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.
S.find(str, pos, n) — искать в данной строке подстроку, равную первым n символам строки str. Значение pos должно быть задано.
Подробней о методе find.
rfind
Ищет последнее вхождение подстроки («правый» поиск). Способы вызова аналогичны способам вызова метода find.
Подробней о методе rfind.
find_first_of
Ищет в данной строке первое появление любого из символов данной строки str. Возвращается номер этого символа или значение string::npos.
Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.
S.find_first_of(str, pos = 0) — искать первое входение любого символа строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.
find_last_of
Ищет в данной строке последнее появление любого из символов данной строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
Подробней о методе find_last_of.
find_first_not_of
Ищет в данной строке первое появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
find_last_not_of
Ищет в данной строке последнее появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
c_str
Возвращает указать на область памяти, в которой хранятся символы строки, возвращает значение типа char*. Возвращаемое значение можно рассматривать как C-строку и использовать в функциях, которые должны получать на вход C-строку.
Подробней о методе c_str.
Как вывести часть строки c
Функция substr() получает подстроку. Эта функция принимает два параметра. Первый параметр представляет индекс, с которого начинается подстрока. Второй параметр — количество символов извлекаемой подстроки. Результатом функции является выделенная строка:
#include #include int main() < std::string message< "tom@localhost.com">; std::string submessage = message.substr(4, 9); // 9 символов начиная с 4-го std::cout
Возможно, что количество символов извлекаемой подстроки будет больше доступного количества символов в строки. В этом случае в подстроку извлекаются все оставшиеся символы:
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 #include int main() < std::string text ; std::string hello ; // проверка, начинаяется ли text на строку hello // с помощью функции compare if (text.compare(0, hello.length(), hello) == 0) < std::cout // с помощью функции substr if (text.substr(0, hello.length()) == hello) < std::cout >
Однако начиная со стандарта C++20 таже можно использовать функцию starts_with() . Если текущая строка начинается на другую строку, то функция возвращает true :
#include #include int main() < std::string text ; std::string hello ; // проверка, начинаяется ли text на строку hello if (text.starts_with(hello)) < std::cout >
Аналогично с помощью функций compare() и substr() можно проверить, завершается ли текст на определенную подстроку. Например:
#include #include int main() < std::string text ; std::string world ; // конченый индекс unsigned end = text.length() - world.length(); // проверка, заканчивается ли text на строку world if (text.compare(end, world.length(), world) == 0) < std::cout // с помощью функции substr if (text.substr(end, world.length()) == world) < std::cout >
Но в стандарт C++20 для этой цели была специально добавлена функцию ends_with() . Если текущая строка заканчивается на другую строку, то функция возвращает true :
#include #include int main() < std::string text ; std::string world ; // проверка, начинаяется ли text на строку world if (text.ends_with(world)) < std::cout >
string::substr в C++: получение частей строк
Привет! В этой статье мы сосредоточимся на полезной функции C++ для работы со строками: substr . Начнем с обзора этой функции, разберемся, как правильно ее использовать, а затем рассмотрим несколько примеров для того, чтобы лучше ее понять. В конце вы найдете упражнения для закрепления материала.
Как извлечь часть строки в C++
Чтобы взять конкретную часть строки в C++, функция substr приходит на помощь:
string substr(size_t pos = 0, size_t len = npos) const;
- Функция начинает работать с символа на позиции pos .
- Она извлекает len символов оттуда или берет символы до конца, если len не указан или если в строке мало символов.
Давайте рассмотрим простой код, где мы используем substr :
#include #include using namespace std; int main() string sentence = "abc + def = abcdef"; cout <"Часть строки: " . substr(6, 3) ; // Вывод: 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 , если попытка выделения памяти не удастся.
Представьте, что вы работаете над программой для извлечения доменных имен из URL. Вот простой подход:
#include #include 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 <"Домен: " . substr(start + 4, end - start - 4) ; // Вывод: example return 0; >
Функция substr в C++ полезна во многих ситуациях. Будь то анализ текстов, обработка ввода пользователя или простое разделение строк, знание того, как использовать substr , может упростить ваши задачи по программированию.
Помните, что хотя инструменты, такие как substr , мощные, их необходимо использовать разумно. Всегда учитывайте возможные исключения и понимайте нюансы, чтобы избежать подводных камней. Удачного программирования!
- Основное применение substr :
- Создайте программу на C++, которая предлагает пользователю ввести предложение.
- Запросите у пользователя начальную позицию и длину.
- Используйте функцию substr , чтобы извлечь часть предложения пользователя на основе их ввода и отобразить результат.
- Примечание: Убедитесь, что обрабатываете возможные исключения или ошибки на основе информации из статьи.
- Обработка исключений:
- Измените программу из первого задания.
- Внесите намеренные ошибки, такие как указание позиции за пределами длины строки.
- Реализуйте механизмы обработки исключений для перехвата любых исключений out_of_range или bad_alloc , отображая соответствующее сообщение об ошибке пользователю.
- Извлечение доменных имен, определенных пользователем:
- Создайте программу на C++, где пользователь предоставляет URL.
- Попросите пользователя указать начальные и конечные ключевые слова домена (например, “www.” и “.com”).
- Используйте функцию substr в сочетании с функцией find , чтобы извлечь и отобразить имя домена.
- Убедитесь, что обрабатываете любые потенциальные ошибки или несоответствия в пользовательском вводе.
Читайте также
В данном уроке вы узнаете: что такое map, как правильно его использовать, какими функциями можно оперировать, а также стоит ли его использовать у себя в проектах.
strlen в C/C++
Функция strlen используется в языке программирования C для подсчета количества символов в строке. В статье будут разобраны примеры использования этой функции. Также мы реализуем эту функцию сами, а в конце статьи есть упражнения для закрепления материала.
string::npos в C++
Разбираем std::string::npos в C++: что это такое, как использовать с методами std::string, а также практический пример использования этой константы.
sprintf в C/C++
Функция sprintf — это близкий аналог функции printf. Основное