Interested Article - Нуль-терминированная строка

Нуль-терминированная строка или C-строка (от названия языка Си ) или ASCIIZ-строка — способ представления строк в языках программирования, при котором вместо введения специального строкового типа используется массив символов, а концом строки считается первый встретившийся специальный нуль-символ (NUL из кода ASCII , со значением 0).

Описание

Например, в строковом буфере (области памяти, выделенной для хранения строки) размером 11 байт нуль-терминированная строка «СТРОКА» в кодировке Windows-1251 может представляться следующим образом:

С Т Р О К А NUL F % NUL 4
0xD1 0xD2 0xD0 0xCE 0xCA 0xC0 0x00 0x46 0x25 0x00 0x34

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

При использовании однобайтных кодировок ( ASCII ) объём памяти, требуемый для представления строки из N символов, равен N + 1 байт. В том случае, когда для кодирования символов применяется Юникод , длина строки зависит от используемого представления Юникода (например, 2N + 2 байта для UCS-2 ).

Такие строки являются стандартом в Си и некоторых других языках программирования. Поскольку они используются для передачи строковых аргументов в стандартные функции во многих операционных системах , операции для работы с нуль-терминированными строками появились в Паскале и других языках.

Для ссылки на нуль-терминированную строку применяется указатель на первый её символ. Это простой, быстрый и гибкий подход, но чреватый ошибками . Программист постоянно должен следить за своим кодом, а именно:

  • быть уверенным, что не случаются переполнения буфера ;
  • аккуратно проводить управление памятью , выделяемой под строки;
  • следить за корректной нуль-терминацией строк при использовании функций, которые её не гарантируют (например, strncpy );
  • в редких случаях, когда размер строки может быть очень велик, следить, что не происходит переполнение целого при подсчёте длины и прочих связанных с длиной вычислениях.

Кроме того, некоторые операции со строками, например, конкатенация , для нуль-терминированных строк выполняются медленнее, чем для других типов строк.

Сравнение с альтернативами

Альтернативой нуль-терминированным строкам являются способы, принятые в Паскале и современных ООП-языках. В Паскале строка начинается с первого элемента массива, а в нулевом элементе хранится длина строки. В этом случае не требуется специального терминатора для обозначения конца строки. С другой стороны, здесь на длину строки накладывается ограничение, связанное с вместимостью нулевого элемента массива, то есть в случае с однобайтовыми элементами длина строки не может превышать 255 символов. Нуль-терминированные строки такому ограничению не подвержены и теоретически могут хранить строки любой длины. В объектно-ориентированных языках применяется хранение записи с длиной строки и ссылкой (или указателем) на массив символов. Эти способы не подвержены недостатку нуль-терминированных строк: они могут хранить в себе нуль-символы без искажений и специального кодирования.

В ряде интерфейсов применяются дважды-нуль-терминированные строки, признаком завершения которых является два последовательных нуль-терминатора .

В языке Си

Для работы с нуль-терминированными строками в языке программирования Си используется ряд функций :

  • strcpy , — копирование строк;
  • , — вычисление длины строки;
  • — поиск символа в строке;
  • strdup — дублирование строк;
  • — поиск подстроки;
  • strtok — разделение строки через разделители на подстроки;
  • — поиск первого вхождения в строку одного из символов другой строки.

В языке ассемблера

В некоторых разновидностях языка ассемблера для определения NUL-терминированных строк используется специальная директива. Так в GNU Assembler-е для этого есть директива .asciz .

См. также

Примечания

  1. . Дата обращения: 17 сентября 2016. Архивировано из 25 сентября 2016 года.
  2. . Дата обращения: 17 сентября 2016. 19 сентября 2016 года.
  3. от 13 февраля 2019 на Wayback Machine / MSDN, 2009
  4. . Дата обращения: 17 сентября 2016. 17 сентября 2016 года.
  5. . Дата обращения: 17 сентября 2016. 17 сентября 2016 года.

Литература

  • Poul-Henning Kamp, от 19 сентября 2016 на Wayback Machine / ACM Queue, Volume 9, issue 7, July 25, 2011 (англ.)
  • (рус.) - от 5 сентября 2016 на Wayback Machine , December 11, 2001 (англ.)

Ссылки

Источник —

Same as Нуль-терминированная строка