Нуль-термінований рядок

У програмуванні нуль-термінований рядок — це рядок символів, що зберігаються у символьному масиві та завершуються нуль-символом ('\0' у ASCII позначається як NUL). Альтернативна назва Cі-рядок, якщо це стосується мови програмування Cі та ASCIIZ (варто зауважити, що Cі-рядок не має на увазі використання ASCII). Нуль-термінальні рядки широко використовуються при зверненнях до API-функцій Windows.[1].

Приклад 10-байтного нуль-термінованого рядка у кодуванні Windows-1251:

РЯДОКNULLF%NULL4
0xD00xDF0xC40xCE0xCA0x000x460x250x000x34

Історія

Нуль-термінований рядок був створений за допомогою .ASCIZ директиви PDP-11 мовою асемблера та директиви ASCIZ з використанням мови асемблера MACRO-10 для PDP-10.

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

В той час, коли C (та мови, які від нього походять) розвивалися, пам'ять була вкрай обмежена, тому використання всього одного зайвого рядка для збереження довжини рядка було привабливою ідеєю. Єдина, популярна на той момент, альтернатива називалася «Рядок Pascal» (хоча використовувалась вона і у ранніх версіях BASIC). Вона використовувала перший байт, щоб зберігати довжину рядка. Такий спосіб дозволяє записати значення NUL (довжини рядка) надсилаючи лише один сигнал до пам'яті. В цьому випадку не потрібно спеціального термінатора для позначення кінця рядка. З іншого боку, тут на довжину рядка накладається обмеження, пов'язане з місткістю нульового елемента масиву, тобто у випадку з однобайтовими елементами довжина рядка не може перевищувати 255 символів. Нуль-терміновані рядки до такого обмеження не схильні і теоретично можуть зберігати рядки будь-якої довжини.

Нуль-терміновані однобайтові рядки

Нуль-термінований однобайтовий рядок (null-terminated byte string, NTBS) — послідовність ненульових байтів з наступним байтом з нульовим значенням (термінальний нульовий символ). Кожен байт в однобайтовому рядку кодує один символ деякого набору символів. Наприклад, символьний масив {'\ x63', '\ x61', '\ x74', '\ 0'} — NTBS, що зберігає рядок «cat» в кодуванні ASCII. В таблиці наведено символи, їх класифікацію та функції, що вони виконують[2].

Класифікація символів у нуль-термінованих однобайтових рядках

  • isalnum — перевіряє, чи є символ буквою або цифрою;
  • isalpha — перевіряє, чи є символ буквою;
  • islower — перевіряє, чи є символ строчною буквою;
  • isupper — перевіряє, чи є символ великою буквою;
  • isdigit — перевіряє, чи є символ цифрою;
  • isxdigit — перевіряє, чи є символ шістнадцятковою цифрою;
  • isgraph — перевіряє, чи є символ графічним;
  • isprint — перевіряє, чи є символ друкованим;
  • ispunct — перевіряє, чи є символ пунктуаційним;
  • isblank — перевіряє, чи є символ порожнім;

Деякі особливості

  • Символи після нуль-символу називаються сміттям — це дані, які могли залишитися в буфері від попередніх рядків або від інших використань пам'яті. Серед них також можуть перебувати нульові символи.
  • Довжина C-рядка зберігається в останньому (NUL) байті. NUL позначає кінець рядка, таким чином він не може знаходитись всередині.
  • Для посилання на нуль-термінований рядок застосовується перший її символ. Це простий, швидкий і гнучкий підхід, але не виключені помилки. Щоб їх уникнути, програміст постійно повинен стежити за своїм кодом, а саме:
    1. бути упевненим, що не трапляються переповнення буфера;
    2. акуратно проводити управління пам'яттю, що виділяється під рядки;
    3. стежити за коректною нуль-термінацією рядків при використанні функцій, які її не гарантують;
    4. в рідкісних випадках, коли розмір рядка може бути дуже великий, стежити, що не відбувається переповнювання цілого при підрахунку довжини та інших пов'язаних з довжиною обчисленнях.

Крім того, деякі операції з рядками, наприклад, конкатенація, для нуль-термінованих рядків виконуються повільніше, ніж для інших типів рядків.

Примітки

Див. також


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.