Нуль-терминированная строка или 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
.
См. также
Примечания
- оригинала 25 сентября 2016 года. . Дата обращения: 17 сентября 2016. Архивировано из
- The Most Expensive One-byte Mistake - ACM Queue . Дата обращения: 17 сентября 2016. 19 сентября 2016 года.
- What is the format of a double-null-terminated string with no strings? от 13 февраля 2019 на Wayback Machine / MSDN, 2009
- Использование GNU ассемблера as.: Ассемблерные директивы . Дата обращения: 17 сентября 2016. 17 сентября 2016 года.
- Архивированная копия . Дата обращения: 17 сентября 2016. 17 сентября 2016 года.
Литература
- Poul-Henning Kamp, The Most Expensive One-byte Mistake. Did Ken, Dennis, and Brian choose wrong with NUL-terminated text strings? от 19 сентября 2016 на Wayback Machine / ACM Queue, Volume 9, issue 7, July 25, 2011 (англ.)
- (рус.) - Back to Basics by Joel Spolsky от 5 сентября 2016 на Wayback Machine, December 11, 2001 (англ.)
Ссылки
- http://c2.com/cgi/wiki?StringWithoutLength от 19 июля 2016 на Wayback Machine
- http://c2.com/cgi/wiki?NonNullTerminatedString от 20 сентября 2016 на Wayback Machine
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер