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

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

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

Р Я Д О К NULL F % NULL 4
0xD0 0xDF 0xC4 0xCE 0xCA 0x00 0x46 0x25 0x00 0x34

Історія

[ред. | ред. код]

Нуль-термінований рядок був створений за допомогою .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. в рідкісних випадках, коли розмір рядка може бути дуже великий, стежити, що не відбувається переповнювання цілого при підрахунку довжини та інших пов'язаних з довжиною обчисленнях.

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

Примітки

[ред. | ред. код]
  1. Null-terminated String (EN). Архів оригіналу за 4 листопада 2014. Процитовано 3 листопада 2014.
  2. Нуль-терминальные однобайтовые строки (RU)

Див. також

[ред. | ред. код]