Строковый тип — это тип данных, значениями которого могут быть произвольные последовательности (строки) символов алфавита.
Введение
С точки зрения информатики, строковым типом (string означает нить, вереница) является тип данных, в качестве значений которого может выступать произвольная очередность (строчка) символов алфавита. Все переменные данного типа (строковые переменные) могут быть представлены фиксированным числом байтов или способны обладать произвольной длиной.
Отдельные языки программирования могут накладывать ряд ограничений на наибольший размер строки, однако в большом количестве других языков программирования таких ограничений не предусмотрено. В случае использования системы Unicode, любые символы строкового типа могут потребовать два или даже четыре байта для своего отображения.
Строковый тип данных
Основными проблемами в области машинного представления строкового типа являются следующие аспекты:
- Строки способны обладать достаточно существенным размером, вплоть до десятков мегабайт.
- Наличие изменяющегося со временем размера, что предопределяет появление ряда трудностей при добавлении и удалении символов.
Для возможности представления строк в памяти компьютера, применяются следующие принципиально разные подходы:
- Подход, состоящий в представлении строк в виде массива символов.
- Подход, состоящий в использовании метода «завершающего байта».
В походе, состоящем в представлении строк в виде массива символов, размеры массива хранятся в специальной, служебной области. Этот метод впервые был применен в языке программирования Pascal, поэтому его еще называют Pascal strings.
В немного оптимизированном варианте этот метод представлен как так называемый формат c-addr u (character-aligned address + unsigned number), используемый в языке программирования Форт. В отличие от Pascal strings, в этом методе размеры массива хранятся не вместе со строковыми данными, а входят как часть указателя на строку.
К числу достоинств данного метода могут быть отнесены следующие обстоятельства:
- Программа в любые временные моменты обладает сведениями о размерах строчки, поэтому процедуры прибавления символов в конец, копирования строки и, естественно, определения размеров строки осуществляются достаточно оперативно.
- В строке могут содержаться абсолютно любой набор данных.
- Имеется возможность на программном уровне отслеживать выход за пределы строки во время ее обработки.
- Имеется возможность быстрого исполнения операции типа «взятие N-ого символа с конца строки».
В качестве недостатков этого метода необходимо выделить следующие моменты:
- Наличие проблем с хранением и выполнением обработки символов, имеющих произвольную длину.
- Возможность увеличения затрат на сохранение строк, так как, значение «длина строки» тоже может занимать некоторое место и при большом числе строчек, имеющих небольшие размеры, могут существенно увеличиться требования алгоритма к оперативной памяти.
- Наличие ограничения на максимальный размер строки. В современных языках программирования данное ограничение является скорее теоретическим, поскольку, как правило, размеры строки хранятся в 32-битовом поле, что определяет наибольший размер строчки в 4 294 967 295 байт, то есть, в четыре гигабайта.
- В случае использования алфавита с переменным размером символов (к примеру, UTF-8), в размерах сохраняется не число символов, а как раз размер строчки в байтах. Это означает, что количество символов следует подсчитывать отдельно.
Методика «завершающего байта» состоит в применении именно «завершающего байта». В этом методе следует выбрать одно из допустимых значений символов алфавита (обычно выбирается символ, имеющий нулевой код) как признак окончания строчки, и строка сохранится в виде последовательности байтов от начала до конца. Известны системы, в которых признаком окончания строки служит не нулевой символ, а байт вида 0xFF (255) или же код символа «$».».
Данный метод обладает следующими равноправными названиями:
- Метод ASCIIZ (или asciz), то есть, набор символов в кодировке ASCII, имеющий нулевой завершающий байт.
- Метод C-strings, который обладает наибольшим распространением в языке программирования Си.
- Метод нуль-терминированных строк.
К числу достоинств данного метода необходимо отнести следующие аспекты:
- Не требуется дополнительная служебная информация о строчке, необходим лишь завершающий байт.
- Имеется возможность представить строку без формирования отдельного типа данных.
- Отсутствуют ограничения на наибольшие размеры строки.
- Память используется в экономном режиме.
- Возможность простого получения суффикса строки.
- Возможность простой передачи строк в функции, то есть, необходимо передать только указатель на первый символ.
К недостаткам этого метода могут быть отнесены следующие моменты:
- Достаточно длительное исполнение процедуры определения длины и конкатенации строчек.
- Отсутствуют средства, контролирующие выход за пределы строки, а в случае повреждения завершающего байта присутствует вероятность повреждений значительных областей памяти, что может вызвать совершенно непредсказуемые последствия, такие как, потеря данных, полный крах программы и даже всей системы.
- Отсутствие возможности использования символа завершающего байта как элемента строки.
- Невозможно применять отдельные типы кодировок, имеющие размер символа в несколько байт (например, UTF-16), поскольку многие такие символы, к примеру, символ Ā (0x0100), имеют один из байтов, равный нулю. Следует, однако, подчеркнуть, что, например, кодировка UTF-8 не имеет данного недостатка.
Изначально в программных языках совсем отсутствовал строковый тип, то есть, программисты должны были самостоятельно формировать функции для работы со строками различных типов. В языке программирования Си применяются нуль-терминированные строки, предполагающие полный ручной контроль со стороны программистов.