Нуль-термінований рядок
У програмуванні нуль-термінований рядок — це рядок символів, що зберігаються у символьному масиві та завершуються нуль-символом[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 позначає кінець рядка, таким чином він не може знаходитись всередині.
- Для посилання на нуль-термінований рядок застосовується перший її символ. Це простий, швидкий і гнучкий підхід, але не виключені помилки. Щоб їх уникнути, програміст постійно повинен стежити за своїм кодом, а саме:
- бути упевненим, що не трапляються переповнення буфера;
- акуратно проводити управління пам'яттю, що виділяється під рядки;
- стежити за коректною нуль-термінацією рядків при використанні функцій, які її не гарантують;
- в рідкісних випадках, коли розмір рядка може бути дуже великий, стежити, що не відбувається переповнювання цілого при підрахунку довжини та інших пов'язаних з довжиною обчисленнях.
Крім того, деякі операції з рядками, наприклад, конкатенація, для нуль-термінованих рядків виконуються повільніше, ніж для інших типів рядків.
- ↑ Null-terminated String (EN). Архів оригіналу за 4 листопада 2014. Процитовано 3 листопада 2014.
- ↑ Нуль-терминальные однобайтовые строки (RU)
Це незавершена стаття про програмування. Ви можете допомогти проєкту, виправивши або дописавши її. |