String word c что это
Для хранения строк в C++ применяется тип string . Для использования этого типа его необходимо подключить в код с помощью директивы include :
Тип string определен в стандартной библиотеке и при его использовании надо указывать пространство имен std .
Либо можно использовать выражение using, чтобы не указывать префикс std:
В данном случае значение переменной hello, которая представляет тип string, выводится на консоль.
При компиляции через g++ может потребоваться указать флаг -static . То есть если код определен в файл hello.cpp, то команда на компиляцию для g++ может выглядеть следующим образом:
Для инициализации строк можно использовать различные способы:
Консольный вывод данной программы:
Если при определении переменной типа string мы не присваиваем ей никакого значения, то по умолчанию данная переменная содержит пустую строку:
Также можно инициализировать переменную строчным литералом, который заключается в двойные кавычки:
В качестве альтернативы можно передавать строку в скобках после определения переменной:
Если необходимо, чтобы строка содержала определенное количесто определеных символов, то можно указать в скобках количество символов и сам символ:
И также можно передать переменной копию другой строки:
Конкатенация строк
Над строками можно выполнять ряд операций. В частности, можно объединять строки с помощью стандартной операции сложения:
Сравнение строк
К строкам можно применять операции сравнения. Оператор == возвращает true, если все символы обеих строк равны.
При этом символы должны совпадать в том числе по регистру.
Операция != возвращает true, если две строки не совпадают.
Остальные базовые операции сравнения < , , >= сравнивают строки в зависимости от регистра и алфавитного порядка символов. Например, строка "b" условно больше строки "a", так как символ b по алфавиту идет после символа a. А строка "a" больше строки "A". Если первые символы строки равны, то сравниваются последующие символы:
В данном случае условие s1 > s2 ложно, то есть s2 больше чем s1, так как при равенстве первых двух символов ("Ap") третий символ второй строки ("o") стоит в алфавите до третьего символа второй строки ("r"), то есть "o" меньше чем "r".
Размер строки
С помощью метода size() можно узнать размер строки, то есть из скольких символов она состоит:
Если строка пустая, то она содержит 0 символов. В этом случае мы можем применить метод empty() - он возвращает true, если строка пустая:
Чтение строки с консоли
Для считывания введенной строки с консоли можно использовать объект std::cin:
Однако если при данном способе ввода строка будет содержать подстроки, разделенные пробелом, то std::cin будет использовать только первую подстроку:
Чтобы считать всю строку, применяется метод getline() :
Метод getline принимает два объекта - std::cin и переменную, в которую надо считать строку.
Получение и изменение символов строки
Подобно массиву мы можем обращаться с помощью индексов к отдельным символам строки, получать и изменять их:
Символьные массивы
Массив символов, последний элемент которого представляет нулевой символ '\0', может использоваться как строка:
Данный код выведет на консоль строку "hello". Подобное определение массива строк будет также эквивалентно следующему:
Однако подобное использование массива строк унаследовано от языка Си, а при написании программ на С++ при работе со строками следует отдавать предпочтение встроенному типу string, а не массиву символов.
Сравнение строки и System.String
Объявление и инициализация строк
Вы можете объявлять и инициализировать строки различными способами, как показано в следующем примере:
Новый оператор не используется для создания строкового объекта, за исключением инициализации строки с массивом символов.
Инициализируйте строку с константным значением Empty для создания нового объекта String, строка которого имеет нулевую длину. Представлением строкового литерала строки с нулевой длиной является "". Если вы инициализируете строки со значением Empty вместо NULL, вы снизите вероятность появления исключения NullReferenceException. Используйте статический метод IsNullOrEmpty(String), чтобы проверить значение строки, прежде чем пытаться получить к ней доступ.
Неизменность строк
Так как "изменение" строки на самом деле является созданием новой строки, создавать ссылки на строки следует с осторожностью. Если вы создадите ссылку на строку, а затем "измените" исходную строку, ссылка будет по-прежнему указывать на исходный объект, а не на новый объект, который был создан при изменении строки. Это поведение проиллюстрировано в следующем коде:
Сведения о создании новых строк, основанных на таких изменениях, как операции поиска и замены исходной строки, см. в инструкциях по изменению содержимого строки.
Строковые литералы в кавычках
Строковые литералы начинаются и заканчиваются одним двойным символом кавычки ( " ) в одной строке. Кавычек строковые литералы лучше всего подходят для строк, которые помещаются в одну строку и не включают escape-последовательности. Строковый литерал в кавычках должен внедрять escape-символы, как показано в следующем примере:
Строковые литералы verbatim
Буквальные строковые литералы более удобны для многостроковых строк, строк, содержащих символы обратной косой черты или внедренных двойных кавычек. Строки verbatim сохраняют новые символы строк в составе текста строки. Используйте двойные кавычки, чтобы вставить кавычки в буквальной строке. В следующем примере показаны наиболее часто используемым буквальные строки:
Необработанные строковые литералы
- Начинается и заканчивается последовательностью не менее трех символов двойной кавычки ( """ ). Для поддержки строковых литералов, содержащих три повторяющихся символа кавычки, можно запустить и завершить последовательность более трех последовательных символов.
- Однострочные необработанные строковые литералы требуют символов открывающей и закрывающей кавычки в одной строке.
- Многострочный необработанные строковые литералы требуют как открывающих, так и закрывающих символов кавычки в собственной строке.
- В многострочных необработанных строковых литералах все пробелы слева от закрывающих кавычек удаляются.
В следующих примерах демонстрируются следующие правила:
В следующих примерах показаны ошибки компилятора, сообщаемые на основе следующих правил:
Первые два примера являются недопустимыми, так как для многострочный необработанных строковых литералом требуется последовательность открывающих и закрывающих кавычки в собственной строке. Третий пример недопустим, так как текст выходит из закрывающей последовательности кавычек.
При создании текста, включающего символы, требующие escape-последовательностей при использовании строковых литералов с кавычками или строковых литералов, следует учитывать необработанные строковые литералы. Необработанные строковые литералы будут проще читать, так как они будут более похожи на выходной текст. Например, рассмотрим следующий код, включающий строку форматированного JSON:
Сравните этот текст с эквивалентным текстом в нашем примере по сериализации JSON, которая не использует эту новую функцию.
Escape-последовательности строк
Escape-последовательность | Имя символа | Кодировка Юникод |
---|---|---|
\' | Одинарная кавычка | 0x0027 |
\" | Двойная кавычка | 0x0022 |
\\ | Обратная косая черта | 0x005C |
\0 | Null | 0x0000 |
\a | Предупреждение | 0x0007 |
\b | Backspace | 0x0008 |
\f | Перевод страницы | 0x000C |
\n | Новая строка | 0x000A |
\r | Возврат каретки | 0x000D |
\t | Горизонтальная табуляция | 0x0009 |
\v | Вертикальная табуляция | 0x000B |
\u | Escape-последовательность Юникода (UTF-16) | \uHHHH (диапазон: 0000–FFFF; пример: \u00E7 = "ç") |
\U | Escape-последовательность Юникода (UTF-32) | \U00HHHHHH (диапазон: 000000 – 10FFFF; пример: \U0001F47D = "👽") |
\x | Escape-последовательность Юникода аналогична "\u", она отличается только длиной переменной | \xH[H][H][H] (диапазон: 0–FFFF; пример: \x00E7 или \x0E7 или \xE7 = "ç") |
Если вы используете escape-последовательность \x с менее чем четырьмя шестнадцатеричными цифрами, то когда непосредственно следующие за ней символы также являются допустимыми шестнадцатеричными цифрами (т. е. 0–9, A–F и a–f), они будут интерпретированы как часть этой escape-последовательности. Например, \xA1 создает ""," — кодовую точку U+00A1. Однако если следующий символ — "A" или "a", то escape-последовательность будет интерпретирована как " \xA1A ਚ", которая является кодовой точкой U+0A1A. В таких случаях, чтобы избежать некорректной интерпретации, указывайте все четыре шестнадцатеричных знака (например, \x00A1 ).
Во время компиляции буквальные строки преобразуются в обычные строки с теми же escape-последовательностями. Поэтому, если вы просматриваете буквальную строку в окне контрольных значений отладчика, вы увидите escape-символы, добавленные компилятором, а не буквальную версию из исходного кода. Например, строка verbatim будет отображаться в окне контрольных @"C:\files.txt" значений как "C:\\files.txt".
Строки формата
Строка формата — это строка, содержимое которой можно определить динамически во время выполнения. Строки формата создаются путем внедрения интерполированных выражений или заполнителей внутри фигурных скобок в строке. Весь код внутри фигурных скобок ( <. >) будет преобразован в значение и выходные данные как отформатированная строка во время выполнения. Существует два способа создания строк формата: интерполяция строк и составное форматирование.
Интерполяция строк
Используйте интерполяцию для повышения удобства чтения и обслуживаемости кода. Интерполяция строк позволяет достичь тех же результатов, что и использование метода String.Format , но более простым и понятным способом.
Составное форматирование
String.Format использует заполнители в фигурных скобках, чтобы создать строку формата. В этом примере результат аналогичен выходным данным, получаемым с помощью метода интерполяции строк, описанного выше.
Подстроки
Подстрока — это последовательность символов, содержащихся в строке. Используйте метод Substring, чтобы создать новую строку из части исходной строки. Одно вхождение подстроки или несколько можно найти с помощью метода IndexOf. Используйте метод Replace, чтобы заменить все вхождения указанной подстроки новой строкой. Как и метод Substring , Replace фактически возвращает новую строку и не изменяет исходную строку. См. дополнительные сведения о поиске строк и изменении содержимого строк.
Доступ к отдельным символам
Используя нотацию массива со значением индекса, можно получить доступ только для чтения к отдельным символам, как показано в следующем примере:
String Если методы не предоставляют функциональные возможности, которые необходимо изменить отдельные символы в строке, можно использовать StringBuilder объект для изменения отдельных символов на месте, а затем создать новую строку для хранения результатов с помощью StringBuilder методов. В следующем примере предположим, что необходимо определенным образом изменить исходную строку, а затем сохранить результаты для дальнейшего использования:
Строки NULL и пустые строки
Пустая строка — это экземпляр объекта System.String, который содержит нуль символов. Пустые строки часто используются в различных сценариях программирования для представления пустого текстового поля. Методы можно вызывать для пустых строк, так как они допустимы System.String . Пустые строки инициализируются следующим образом:
В отличие от этого, строка NULL не ссылается на экземпляр System.String объекта, и любая попытка вызова метода в пустой строке NullReferenceExceptionвызывает . Но вы можете использовать строки NULL в операциях объединения и сравнения с другими строками. В следующих примерах показаны некоторые случаи, когда ссылка на пустую строку выполняется и не приводит к возникновению исключения:
Использование stringBuilder для быстрого создания строк
В этом примере объект StringBuilder используется для создания строки из набора числовых типов:
Строки, методы расширения и LINQ
Так как тип String использует IEnumerable , вы можете применять методы расширения, определенные для строк в классе Enumerable. Чтобы избежать визуального String загромождений, эти методы исключаются из IntelliSense для типа, но они доступны тем не менее. Можно также использовать выражения запроса LINQ в строках. Дополнительные сведения см. в документации по LINQ и строкам.
БлогNot. Лекции по C/C++: строки класса string
Лекции по C/C++: строки класса string
В современном стандарте C++ определен класс с функциями и свойствами (переменными) для организации работы со строками (в классическом языке C строк как таковых нет, есть лишь массивы символов char ):
Для работы со строками также нужно подключить стандартный namespace :
В противном случае придётся везде указывать описатель класса std::string вместо string .
Ниже приводится пример программы, работающей со string (в старых си-совместимых компиляторах не работает!):
- инициализация массивом символов (строкой встроенного типа) или другим объектом типа string . Встроенный тип не обладает второй возможностью;
- копирование одной строки в другую. Для встроенного типа приходится использовать функцию strcpy() ;
- доступ к отдельным символам строки для чтения и записи. Во встроенном массиве для этого применяется операция взятия индекса или косвенная адресация с помощью указателя;
- сравнение двух строк на равенство. Для встроенного типа используются функции семейства strcmp() ;
- конкатенация (сцепление) двух строк, дающая результат либо как третью строку, либо вместо одной из исходных. Для встроенного типа применяется функция strcat() , однако чтобы получить результат в новой строке, необходимо последовательно задействовать функции strcpy() и strcat() , а также позаботиться о выделении памяти;
- встроенные средства определения длины строки (функции-члены класса size() и l ength() ). Узнать длину строки встроенного типа можно только вычислением с помощью функции strlen() ;
- возможность узнать, пуста ли строка.
Рассмотрим эти базовые возможности более подробно.
Инициализация строк при описании и длина строки (не включая завершающий нуль-терминатор):
Строка может быть задана и пустой:
Для проверки того, пуста ли строка, можно сравнить ее длину с 0:
или применить метод empty() , возвращающий true для пустой строки и false для непустой:
Третья форма создания строки инициализирует объект типа string другим объектом того же типа:
Строка st3 инициализируется строкой st . Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения ( == ):
Как скопировать одну строку в другую? С помощью обычной операции присваивания:
Для сцепления строк используется операция сложения ( + ) или операция сложения с присваиванием ( += ). Пусть даны две строки:
Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом:
Если же мы хотим добавить s2 в конец s1 , мы должны написать:
Операция сложения может сцеплять объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом char * , а значимые слова – объектами класса string :
Подобные выражения работают потому, что компилятор "знает", как автоматически преобразовывать объекты встроенного типа в объекты класса string . Возможно и простое присваивание встроенной строки объекту string :
Обратное преобразование при этом не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции:
Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с названием c_str() ("строка Си"):
Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе. Ключевое слово const здесь предотвращает "опасную" в современных визуальных средах возможность непосредственной модификации содержимого объекта через указатель.
К отдельным символам объекта типа string , как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания:
Но лучше читать документацию по C++ и пользоваться его возможностями. Например, предыдущее действие мы могли бы выполнить вызовом одной-единственной функции replace() :
Правда, здесь использован не метод replace класса string , а одноимённый алгоритм:
Поскольку объект string ведет себя как контейнер, к нему могут применяться и другие алгоритмы. Это позволяет решать задачи, не решаемые напрямую функциями класса string .
Задание символов в строке
назначает символы строке
Доступ к отдельным символам
получение указанного символа с проверкой выхода индекса за границы
получение указанного символа
получение первого символа
получение последнего символа
возвращает указатель на первый символ строки
возвращает немодифицируемый массив символов С , содержащий символы строки
Конкатенация строк или объединение может производиться как с помощью операции + , так и с помощью метода Concat :
Метод Concat является статическим методом класса string, принимающим в качестве параметров две строки. Также имеются другие версии метода, принимающие другое количество параметров.
Для объединения строк также может использоваться метод Join :
Метод Join также является статическим. Использованная выше версия метода получает два параметра: строку-разделитель (в данном случае пробел) и массив строк, которые будут соединяться и разделяться разделителем.
Сравнение строк
Для сравнения строк применяется статический метод Compare :
Данная версия метода Compare принимает две строки и возвращает число. Если первая строка по алфавиту стоит выше второй, то возвращается число меньше нуля. В противном случае возвращается число больше нуля. И третий случай - если строки равны, то возвращается число 0.
В данном случае так как символ h по алфавиту стоит выше символа w, то и первая строка будет стоять выше.
Поиск в строке
С помощью метода IndexOf мы можем определить индекс первого вхождения отдельного символа или подстроки в строке:
Подобным образом действует метод LastIndexOf , только находит индекс последнего вхождения символа или подстроки в строку.
Еще одна группа методов позволяет узнать начинается или заканчивается ли строка на определенную подстроку. Для этого предназначены методы StartsWith и EndsWith . Например, в массиве строк хранится список файлов, и нам надо вывести все файлы с расширением exe:
Разделение строк
С помощью функции Split мы можем разделить строку на массив подстрок. В качестве параметра функция Split принимает массив символов или строк, которые и будут служить разделителями. Например, подсчитаем количество слов в сроке, разделив ее по пробельным символам:
Это не лучший способ разделения по пробелам, так как во входной строке у нас могло бы быть несколько подряд идущих пробелов и в итоговый массив также бы попадали пробелы, поэтому лучше использовать другую версию метода:
Второй параметр StringSplitOptions.RemoveEmptyEntries говорит, что надо удалить все пустые подстроки.
Обрезка строки
Для обрезки начальных или концевых символов используется функция Trim :
Функция Trim без параметров обрезает начальные и конечные пробелы и возвращает обрезанную строку. Чтобы явным образом указать, какие начальные и конечные символы следует обрезать, мы можем передать в функцию массив этих символов.
Эта функция имеет частичные аналоги: функция TrimStart обрезает начальные символы, а функция TrimEnd обрезает конечные символы.
Обрезать определенную часть строки позволяет функция Substring :
Функция Substring также возвращает обрезанную строку. В качестве параметра первая использованная версия применяет индекс, начиная с которого надо обрезать строку. Вторая версия применяет два параметра - индекс начала обрезки и длину вырезаемой части строки.
Вставка
Для вставки одной строки в другую применяется функция Insert :
Первым параметром в функции Insert является индекс, по которому надо вставлять подстроку, а второй параметр - собственно подстрока.
Удаление строк
Удалить часть строки помогает метод Remove :
Первая версия метода Remove принимает индекс в строке, начиная с которого надо удалить все символы. Вторая версия принимает еще один параметр - сколько символов надо удалить.
Замена
Чтобы заменить один символ или подстроку на другую, применяется метод Replace :
Во втором случае применения функции Replace строка из одного символа "о" заменяется на пустую строку, то есть фактически удаляется из текста. Подобным способом легко удалять какой-то определенный текст в строках.
Смена регистра
Для приведения строки к верхнему и нижнему регистру используются соответственно функции ToUpper() и ToLower() :
Довольно большое количество задач, которые могут встретиться при разработке приложений, так или иначе связано с обработкой строк - парсинг веб-страниц, поиск в тексте, какие-то аналитические задачи, связанные с извлечением нужной информации из текста и т.д. Поэтому в этом плане работе со строками уделяется особое внимание.
Создание строк
Создавать строки можно, как используя переменную типа string и присваивая ей значение, так и применяя один из конструкторов класса String:
Конструктор String имеет различное число версий. Так, вызов конструктора
6 раз повторит объект из первого параметра, то есть фактически создаст строку "aaaaaa".
Еще один конструктор принимает массив символов, из которых создается строка
Третий использованный выше в примере конструктор позволяет создать строку из части массива символов. Второй параметр передает начальный индекс, с которого извлкаются символы, а третий параметр указывает на количество символов:
Строка как набор символов
Так как строка хранит коллекцию символов, в ней определен индексатор для доступа к этим символам:
Применяя индексатор, мы можем обратиться к строке как к массиву символов и получить по индексу любой из ее символов:
Используя свойство Length , как и в обычном массиве, можно получить длину строки.
Перебор строк
Класс String реализует интерфейс IEnumerable, благодаря чему строку можно перебрать в цикле foreach как набор объектов char. Также можно с помощью других типов циклов перебрать строку, применяя обращение к символам по индексу:
Сравнение строк
В отличие от других классов строки сравниваются по значению их символов, а не по ссылкам:
Основные методы строк
Основная функциональность класса String раскрывается через его методы, среди которых можно выделить следующие:
Compare : сравнивает две строки с учетом текущей культуры (локали) пользователя
CompareOrdinal : сравнивает две строки без учета локали
Contains : определяет, содержится ли подстрока в строке
Concat : соединяет строки
CopyTo : копирует часть строки, начиная с определенного индекса в массив
EndsWith : определяет, совпадает ли конец строки с подстрокой
Format : форматирует строку
IndexOf : находит индекс первого вхождения символа или подстроки в строке
Insert : вставляет в строку подстроку
Join : соединяет элементы массива строк
LastIndexOf : находит индекс последнего вхождения символа или подстроки в строке
Replace : замещает в строке символ или подстроку другим символом или подстрокой
Читайте также: