Рядок (програмування): відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
Немає опису редагування
Немає опису редагування
Рядок 1:
{{Otheruses|Рядок (значення)}}
'''Рядок'''&nbsp;або '''строковий'''(англ. [[String (C++)|String]] «<nowiki/>[[нитка]], [[низка]]<nowiki/>») '''[[Тип даних|тип данних]]''' — це тип даних, значеннями якого є довільна послідовність (рядок) символів [[Абетка|алфавіту]]. Кожна змінна такого типу (строкова змінна) може бути представлена фіксованою кількістю [[Байт|байтів]] або мати довільну довжину.
 
== Внутрішнє представлення рядка в пам'яті ==
Деякі [[Мова програмування|мови програмування]] накладають обмеження на максимальну довжину рядка, але в більшості мов подібні обмеження відсутні. При використанні [[Юнікод|Unicode]] кожен символ строкового типу може вимагати двох або навіть чотирьох байтів для свого представлення.
 
Основні проблеми в машинному поданні строкового типу:
Рядок 11:
 
=== Подання масивом символів ===
У цьому підході рядки представляються [[Масив|масивом]] символів; при цьому розмір масиву зберігається в окремій (службової) області. Від назви мови Pascal, де цей метод був вперше реалізований, даний метод отримав назву Pascal strings.
 
Злегка оптимізованим варіантом цього методу є т. Н. формат c-addr u (від англ. character-aligned address + unsigned number), застосовуваний в Форте. На відміну від Pascal strings, тут розмір масиву зберігається не спільно із строковими даними, а є частиною покажчика на рядок.
Рядок 24:
* проблеми зі зберіганням і обробкою символів довільної довжини;
* збільшення витрат на зберігання рядків - значення «довжина рядка» також займає місце і в разі великої кількості рядків маленького розміру може істотно збільшити вимоги алгоритму до оперативної пам'яті;
* обмеження максимального розміру рядка. У сучасних мовах програмування це обмеження скоріше теоретичне, так як зазвичай розмір рядка зберігається в 32-бітовому полі, що дає максимальний розмір рядка в 4 294 967 295 байт (4 [[Гігабайт|гігабайти]]);
 
* при використанні алфавіту зі змінним розміром символу (наприклад, [[UTF-8]]), в розмірі зберігається не кількість символів, а саме розмір рядка в байтах, тому кількість символів необхідно вважати окремо.
 
=== Метод «завершального байту» ===
Другий метод полягає в використанні «завершального байту»<ref>http://queue.acm.org/detail.cfm?id=2010365</ref><ref>http://russian.joelonsoftware.com/Articles/BacktoBasics.html</ref>. Одне з можливих значень символів алфавіту (як правило, це символ з кодом 0) вибирається як ознака кінця рядка, і рядок зберігається як послідовність байтів від початку до кінця. Є системи, в яких в якості ознаки кінця рядка використовується не символ 0, а байт 0xFF (255) або код символу «$».
 
Метод має три назви - ASCIIZ (або asciz, символи в кодуванні ASCII з нульовим завершальним байтом), C-strings (найбільшого поширення метод отримав саме в мові Сі).
Рядок 45:
* відсутність засобів контролю за виходом за межі рядка, в разі пошкодження завершального байта можливість пошкодження великих областей пам'яті, що може привести до непередбачуваних наслідків - втрати даних, краху програми і навіть всієї системи;
* неможливість використовувати символ завершального байта в якості елемента рядка.
* неможливість використовувати деякі кодування з розміром символу в кілька байт (наприклад, [[UTF-16]]), тому що у багатьох таких символах, наприклад Ā (0x0100), один з байтів дорівнює нулю (в той же час, кодування [[UTF-8]] вільна від цього недоліку).
 
=== Використання обох методів ===
Рядок 58:
* У Сі використовуються нуль-терминировать рядки з повним ручним контролем з боку програміста.
 
* У стандартному Паскалі рядок виглядає як масив з 256 байтів; перший байт зберігав довжину рядка, в інших зберігається її тіло. Таким чином, довжина рядка не може перевищувати 255 символів. У Borland Pascal 7.0 також з'явилися рядки «а-ля Сі» - очевидно, через те, що в число підтримуваних платформ увійшла [[Microsoft Windows|Windows]].
 
* У Object Pascal і C ++ STL рядок є «чорним ящиком», в якому виділення / вивільнення пам'яті відбувається автоматично - без участі програміста. При створенні рядка пам'ять виділяється автоматично; як тільки на рядок не залишиться жодного посилання, пам'ять повертається системі. Перевага цього методу в тому, що програміст не замислюється над роботою рядків. З іншого боку, програміст має недостатній контроль над роботою програми в критичних до швидкості ділянках; також важко реалізується передача таких рядків як параметр в DLL. Також Object Pascal автоматично стежить, щоб в кінці рядка був символ з кодом 0. Тому якщо функція вимагає на вході нуль-терминировать рядок, для конвертації треба просто написати PAnsiChar (строковая_переменная) або PWideChar (строковая_переменная) (для Pascal), переменная.c_str ( ) (для Builder / STL).
Рядок 69:
 
=== Найпростіші операції з рядками ===
* Отримання символу за номером позиції ([[Індекс|індексу]]) - в більшості мов це тривіальна операція;
* Конкатенація (з'єднання) рядків.
 
Рядок 80:
 
=== Операції при трактуванні рядків як списків ===
* Згортання;
* Згортка;
* Відображення одного списку на інший;
 
Рядок 92:
* Порівняння на близькість зазначених рядків по заданому критерію;
 
* Визначення мови і [[кодування]] тексту на підставі ймовірностей символів і складів.
 
== Подання символів рядка ==