Открыть сервис

Строки как тип данных в программировании

Строка — в информатике и программировании последовательность символов, рассматриваемая как единое значение и обычно служащая для представления текстовой информации. Строка относится к базовым (скалярным или составным) типам данных и поддерживается практически во всех языках программирования, библиотеках и системах управления базами данных. В отличие от числа, строка не участвует в арифметических операциях напрямую, а обрабатывается операциями конкатенации, сравнения, поиска подстроки, извлечения фрагмента и преобразования регистра.

Общее понятие

С точки зрения формальных языков строка — это конечная последовательность символов некоторого алфавита. Алфавит может быть ограничен (например, цифры или буквы латинского алфавита) либо включать произвольные символы Unicode. Длина строки — число символов в ней; строка нулевой длины называется пустой и обычно обозначается двумя кавычками без содержимого.

В большинстве языков строка является неизменяемым (immutable) значением: операции, «изменяющие» строку, фактически создают новую. Так устроены строки в Java, C#, Python и JavaScript. В ряде языков, например в C, строка представляет собой массив символов, оканчивающийся нулевым байтом, и допускает изменение на месте.

Представление в памяти

Существуют два основных способа хранения строк:

  • Массив символов с терминатором. Строка занимает непрерывный участок памяти, конец обозначается специальным нулевым символом. Так работают строки в языке C; длина вычисляется проходом до терминатора.
  • Структура «длина + буфер». Хранятся указатель на данные и отдельное поле длины. Так устроены строки в Pascal, Java, C# и большинстве современных языков, что позволяет получать длину за постоянное время.

Отдельно выделяют хранение в кодировках фиксированной ширины (например, UTF-32, где каждый символ занимает 4 байта) и переменной ширины (UTF-8, UTF-16). В UTF-8 один символ может занимать от одного до четырёх байтов, поэтому «длина в байтах» и «длина в символах» не совпадают.

Классификация

Строки различают по нескольким признакам.

ПризнакВарианты
Изменяемостьнеизменяемые, изменяемые
КодировкаASCII, UTF-8, UTF-16, UTF-32, однобайтовые национальные
Назначениетекстовые, бинарные, форматные
Хранениев стеке, в куче, в пуле литералов

Бинарные строки (byte strings) содержат произвольные байты и не предполагают текстовой интерпретации; они применяются при работе с файлами, сетью и криптографией. Форматные строки содержат спецификаторы подстановки и используются в функциях форматированного вывода.

Основные операции

Типовой набор операций над строками включает:

  • Конкатенациясоединение двух строк в одну.
  • Сравнение — лексикографическое сопоставление по кодам символов; в ряде языков учитывается локаль (правила языка и региона).
  • Поиск подстрокиопределение позиции вхождения; реализуется алгоритмами Кнута — Морриса — Пратта, Бойера — Мура, Рабина — Карпа.
  • Извлечение подстроки — получение фрагмента по начальному индексу и длине.
  • Разбиение и объединение — деление строки по разделителю и обратная сборка.
  • Замена — подстановка одного фрагмента вместо другого.
  • Обрезкаудаление пробельных символов по краям.
  • Преобразование регистраприведение к верхнему или нижнему регистру.

Отдельно стоит сопоставление с образцомрегулярные выражения, позволяющие описывать сложные шаблоны поиска и замены.

Строки в языках программирования

В языке C строка — это массив типа char, завершающийся нулевым байтом; функции работы со строками собраны в заголовочном файле string.h. В C++ существует два подхода: си-строки и класс std::string из стандартной библиотеки. В Pascal и его потомках строка хранит длину в первом байте или в отдельном поле. В Java и C# строки неизменяемы, а для частых модификаций предусмотрены классы-построители (StringBuilder). В Python строки неизменяемы и поддерживают богатый набор методов, а также срезы (slices). В SQL строковые типы представлены как CHAR фиксированной длины, VARCHAR переменной длины и TEXT для больших объёмов.

Применение

Строки лежат в основе обработки текста: ввода и вывода данных, работы с файлами и конфигурациями, разбора языков и форматов (JSON, XML, CSV), веб-разработки, баз данных, поисковых систем, криптографии и локализации интерфейсов. Значительная часть прикладных задач сводится к преобразованию строк: нормализация, валидация, токенизация, сравнение и сортировка.

Проблемы и особенности

К типичным сложностям относят:

  • Кодировки. Несовпадение кодировок приводит к искажению символов; переход на Unicode снял часть проблем, но породил различия между длиной в байтах и в символах.
  • Производительность. Частая конкатенация неизменяемых строк создаёт множество промежуточных объектов; для таких случаев применяют буферы.
  • Сравнение и локаль. Порядок сортировки зависит от языка и региона, что влияет на корректность вывода.
  • Безопасность. Некорректная обработка строк лежит в основе внедрения SQL-кода, межсайтового скриптинга и атак переполнения буфера. Защита строится на экранировании, параметризованных запросах и проверке длины.
  • Интернационализация. Поддержка многобайтовых алфавитов, направления письма и составных символов усложняет посимвольную обработку.

Интересные факты

Термин «string» (нить, последовательность) закрепился в программировании в 1960-х годах. В языке C отсутствие встроенного типа строки считается одной из частых причин ошибок начинающих. Пул строковых литералов в Java позволяет одинаковым литералам ссылаться на один объект в памяти. В UTF-8 совместимость с ASCII достигнута так, что любой корректный ASCII-текст одновременно является корректным UTF-8.

Источники: стандарты ISO/IEC по языкам программирования, документация по языкам C, C++, Java, Python, C#, документация Unicode Consortium, учебные курсы по алгоритмам обработки строк.