Рядок (англ. String — «нитка, низка») або рядковий тип даних, також іноді стрічка, ланцюжок — це тип даних, значеннями якого є довільна послідовність (рядок) символів алфавіту. Кожна змінна такого типу (рядкова змінна) може бути представлена фіксованою кількістю байтів або мати довільну довжину.
Внутрішнє представлення рядка в пам'яті
Деякі мови програмування накладають обмеження на максимальну довжину рядка, але в більшості мов подібні обмеження відсутні. При використанні Unicode кожен символ рядкового типу може вимагати двох або навіть чотирьох байтів для свого представлення.
Основні проблеми в машинному поданні рядкового типу:
- рядки можуть мати досить істотний розмір (до декількох десятків мегабайтів);
- змінюється з часом розмір — виникають труднощі з додаванням і видаленням символів.
У поданні рядків в пам'яті комп'ютера існує два принципово різних підходи.
Подання масивом символів
У цьому підході рядки представляються масивом символів; при цьому розмір масиву зберігається в окремій (службовій) області. Від назви мови Pascal, де цей метод був вперше реалізований, даний метод отримав назву Pascal strings.
Злегка оптимізованим варіантом цього методу є так званий формат c-addr-u (від англ. character-aligned address + unsigned number), застосовуваний в Форте. На відміну від Pascal strings, тут розмір масиву зберігається не спільно із рядковими даними, а є частиною покажчика на рядок.
Переваги
- програма в кожен момент часу містить відомості про розмір рядка, тому операції додавання символів в кінець, копіювання рядка і власне отримання розміру рядка виконуються досить швидко;
- рядок може містити будь-які дані;
- можливо на програмному рівні стежити за виходом за межі рядка при її обробці;
- можливо швидке виконання операції виду «взяття N-го символу з кінця рядка».
Недоліки
- проблеми зі зберіганням і обробкою символів довільної довжини;
- збільшення витрат на зберігання рядків — значення «довжина рядка» також займає місце і в разі великої кількості рядків маленького розміру може істотно збільшити вимоги алгоритму до оперативної пам'яті;
- обмеження максимального розміру рядка. У сучасних мовах програмування це обмеження скоріше теоретичне, так як зазвичай розмір рядка зберігається в 32-бітовому полі, що дає максимальний розмір рядка в 4 294 967 295 байт (4 гігабайти);
- при використанні алфавіту зі змінним розміром символу (наприклад, UTF-8), в розмірі зберігається не кількість символів, а саме розмір рядка в байтах, тому кількість символів необхідно вважати окремо.
Метод «завершального байту»
Другий метод полягає у використанні «завершального байту». Одне з можливих значень символів алфавіту (як правило, це символ з кодом 0) вибирається як ознака кінця рядка, і рядок зберігається як послідовність байтів від початку до кінця. Є системи, в яких роль ознаки кінця рядка виконує не символ 0, а байт 0xFF (255) або код символу «$».
Метод має три назви — ASCIIZ (або asciiz, символи в кодуванні ASCII з нульовим завершальним байтом), C-strings (найбільшого поширення метод отримав саме в мові Сі), нуль-термінований рядок (англ. null-terminated string).
Переваги
- відсутність додаткової службової інформації про рядок (крім завершального байту);
- можливість подання рядка без створення окремого типу даних;
- відсутність обмеження на максимальний розмір рядка;
- економне використання пам'яті;
- простота отримання суфіксу рядка;
- простота передачі рядків у функції (передається покажчик на перший символ);
Недоліки
- значний час виконання операцій отримання довжини і конкатенації рядків;
- відсутність засобів контролю за виходом за межі рядка, в разі пошкодження завершального байта можливість пошкодження великих областей пам'яті, що може привести до непередбачуваних наслідків — втрати даних, краху програми і навіть всієї системи;
- неможливість використовувати символ завершального байту як елемента рядка.
- неможливість використовувати деякі кодування з розміром символу в кілька байт (наприклад, UTF-16), тому що у багатьох таких символах, наприклад Ā (0x0100), один з байтів дорівнює нулю (в той же час, кодування UTF-8 вільне від цього недоліку).
Використання обох методів
У таких мовах, як, наприклад, Оберон, рядок розміщується в масиві символів певної довжини, причому її кінець позначається нульовим символом. За замовчуванням, весь масив заповнений нульовими символами. Такий спосіб дозволяє об'єднати багато переваг обох підходів, а також уникнути більшість їх недоліків.
Подання у вигляді списку
Мови Erlang, Haskell, Пролог використовують для рядкового типу список символів. Цей метод робить мову більш «теоретично елегантною» за рахунок дотримання ортогональності в системі типів, але приносить суттєві втрати швидкодії.
Реалізація в мовах програмування
- У перших мовах програмування взагалі не було рядкового типу; програміст повинен був сам будувати функції для роботи з рядками того чи іншого типу.
- У Сі використовуються нуль-терміновані рядки з повним ручним контролем з боку програміста.
- У стандартному Паскалі рядок виглядає як масив з 256 байтів; перший байт зберігав довжину рядка, в інших зберігається її тіло. Таким чином, довжина рядка не може перевищувати 255 символів. У Borland Pascal 7.0 також з'явилися рядки «по типу — очевидно[], через те, що в число підтримуваних платформ увійшла Windows.
- У Object Pascal та STL рядок є «чорним ящиком», в якому виділення / вивільнення пам'яті відбувається автоматично — без участі програміста. При створенні рядка пам'ять виділяється автоматично; як тільки на рядок не залишиться жодного посилання, пам'ять повертається системі. Перевага цього методу в тому, що програміст не замислюється над роботою рядків. З іншого боку, програміст має недостатній контроль над роботою програми в критичних до швидкості ділянках; також важко реалізується передача таких рядків як параметр в DLL. Також Object Pascal автоматично стежить, щоб в кінці рядка був символ з кодом 0. Тому якщо функція вимагає на вході нуль-термінований рядок, для конвертації треба просто написати
PAnsiChar(рядкова_змінна)
абоPWideChar (рядкова_змінна) (для Pascal)
,змінна c_str() (для Builder / STL)
.
- У C # та іншими мовами із збіркою сміття рядок є незмінним об'єктом; якщо рядок потрібно модифікувати, створюється інший об'єкт. Цей метод повільний і витрачає чимало тимчасової пам'яті, але добре поєднується з концепцією збірки сміття. Перевага цього методу в тому, що присвоювання відбувається швидко і без дублювання рядків. Також є деякий ручний контроль над конструюванням рядків (в Java, наприклад, через класи StringBuffer і StringBuilder) — це дозволяє зменшити кількість виділень і вивільнень пам'яті і, відповідно, збільшити швидкість.
- У деяких мовах (наприклад, Standard ML) крім цього, є додатковий модуль для забезпечення ще більшої ефективності — «підрядок» (англ. substring). Його використання дозволяє виконувати операції над рядками без копіювання їхніх тіл за допомогою маніпулювання індексами початку і кінця підрядка; фізичне копіювання відбувається лише при необхідності перетворення підрядків у рядки.
Операції
Найпростіші операції з рядками
- Отримання символу за номером позиції (індексу) — в більшості мов це тривіальна операція;
- Конкатенація (з'єднання) рядків.
Похідні операції
- Отримання підрядка за індексами початку і кінця;
- Перевірка входження одного рядка в іншу (пошук підрядка в рядку);
- Перевірка на збіг рядків (з урахуванням або без урахування регістру символів);
- Отримання довжини рядка;
- Заміна підрядка в рядку.
Операції при трактуванні рядків як списків
- Згортання;
- Відображення одного списку на інший;
- Фільтрація списку за критерієм.
Складніші операції
- Знаходження мінімального надрядка, що містить всі зазначені рядки;
- Пошук в двох масивах рядків збігаються послідовностей (завдання про плагіат).
Можливі завдання для рядків на природній мові
- Порівняння на близькість зазначених рядків по заданому критерію;
- Визначення мови і кодування тексту на підставі ймовірностей символів і складів.
Подання символів рядка
До останнього часу[] один символ завжди кодувався одним байтом (8 двійкових бітів; застосовувалися також кодування з 7 бітами на символ), що дозволяло представляти 256 (128 при семибітному кодуванні) можливих значень. Однак для повноцінного представлення символів алфавітів кількох мов (багатомовних документів, друкарських символів — кілька видів лапок, тире, кількох видів прогалин і для написання текстів на ієрогліфічних мовах — китайською, японською та корейською) 256 символів недостатньо. Для вирішення цієї проблеми існує кілька методів:
- Перемикання мови керуючими кодами. Метод не стандартизований і позбавляє текст самостійності (тобто послідовність символів без керуючого коду на початку втрачає сенс); використовувався в деяких ранніх русифікації ZX Spectrum і БК.
- Використання двох або більше байт для представлення кожного символу (UTF-16, UTF-32). Головним недоліком цього методу є втрата сумісності з попередніми бібліотеками для роботи з текстом при поданні рядка як ASCIIZ. Наприклад, кінцем рядка повинен вважатися вже не байт із значенням 0, а два або чотири поспіль нульових байти, в той час як одиночний байт «0» може зустрічатися в середині рядка, що збиває бібліотеку «з пантелику».
- Використання кодування зі змінним розміром символу. Наприклад, в UTF-8 частина символів представляється одним байтом, частина двома, трьома або чотирма. Цей метод дозволяє зберегти часткову сумісність зі старими бібліотеками (немає символів 0 всередині рядка і тому 0 можна використовувати як ознака кінця рядка), але призводить до неможливості прямої адресації символу в пам'яті за номером його позиції в рядку.
Див. також
Примітки
- Мейнарович, Євген (2010). Англійсько-український словник. Математика та кібернетика. Київ: Перун.
- Чи правильно вживати “стрічка” в значенні “рядок”?. Процитовано 12.01.2020.
- Глушков В.М., ред. (1973). Енциклопедія кібернетики. Київ: Гол. ред. Української радянської енциклопедії.
- http://queue.acm.org/detail.cfm?id=2010365
- . Архів оригіналу за 25 вересня 2016. Процитовано 11 грудня 2016.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - Simon St. Laurent. Introducing Erlang. — O'Reilly Media, Inc., 2013. — P. 62. — 185 p. — .
- http://book.realworldhaskell.org/read/characters-strings-and-escaping-rules.html
- http://www.swi-prolog.org/pldoc/man?section=text-representation
Це незавершена стаття про інформаційні технології. Ви можете проєкту, виправивши або дописавши її. |
Ця стаття потребує додаткових для поліпшення її . (грудень 2018) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Ryadok znachennya Ryadok angl String nitka nizka abo ryadkovij tip danih takozh inodi strichka lancyuzhok ce tip danih znachennyami yakogo ye dovilna poslidovnist ryadok simvoliv alfavitu Kozhna zminna takogo tipu ryadkova zminna mozhe buti predstavlena fiksovanoyu kilkistyu bajtiv abo mati dovilnu dovzhinu Vnutrishnye predstavlennya ryadka v pam yatiDeyaki movi programuvannya nakladayut obmezhennya na maksimalnu dovzhinu ryadka ale v bilshosti mov podibni obmezhennya vidsutni Pri vikoristanni Unicode kozhen simvol ryadkovogo tipu mozhe vimagati dvoh abo navit chotiroh bajtiv dlya svogo predstavlennya Osnovni problemi v mashinnomu podanni ryadkovogo tipu ryadki mozhut mati dosit istotnij rozmir do dekilkoh desyatkiv megabajtiv zminyuyetsya z chasom rozmir vinikayut trudnoshi z dodavannyam i vidalennyam simvoliv U podanni ryadkiv v pam yati komp yutera isnuye dva principovo riznih pidhodi Podannya masivom simvoliv U comu pidhodi ryadki predstavlyayutsya masivom simvoliv pri comu rozmir masivu zberigayetsya v okremij sluzhbovij oblasti Vid nazvi movi Pascal de cej metod buv vpershe realizovanij danij metod otrimav nazvu Pascal strings Zlegka optimizovanim variantom cogo metodu ye tak zvanij format c addr u vid angl character aligned address unsigned number zastosovuvanij v Forte Na vidminu vid Pascal strings tut rozmir masivu zberigayetsya ne spilno iz ryadkovimi danimi a ye chastinoyu pokazhchika na ryadok Perevagi programa v kozhen moment chasu mistit vidomosti pro rozmir ryadka tomu operaciyi dodavannya simvoliv v kinec kopiyuvannya ryadka i vlasne otrimannya rozmiru ryadka vikonuyutsya dosit shvidko ryadok mozhe mistiti bud yaki dani mozhlivo na programnomu rivni stezhiti za vihodom za mezhi ryadka pri yiyi obrobci mozhlivo shvidke vikonannya operaciyi vidu vzyattya N go simvolu z kincya ryadka Nedoliki problemi zi zberigannyam i obrobkoyu simvoliv dovilnoyi dovzhini zbilshennya vitrat na zberigannya ryadkiv znachennya dovzhina ryadka takozh zajmaye misce i v razi velikoyi kilkosti ryadkiv malenkogo rozmiru mozhe istotno zbilshiti vimogi algoritmu do operativnoyi pam yati obmezhennya maksimalnogo rozmiru ryadka U suchasnih movah programuvannya ce obmezhennya skorishe teoretichne tak yak zazvichaj rozmir ryadka zberigayetsya v 32 bitovomu poli sho daye maksimalnij rozmir ryadka v 4 294 967 295 bajt 4 gigabajti pri vikoristanni alfavitu zi zminnim rozmirom simvolu napriklad UTF 8 v rozmiri zberigayetsya ne kilkist simvoliv a same rozmir ryadka v bajtah tomu kilkist simvoliv neobhidno vvazhati okremo Metod zavershalnogo bajtu Drugij metod polyagaye u vikoristanni zavershalnogo bajtu Odne z mozhlivih znachen simvoliv alfavitu yak pravilo ce simvol z kodom 0 vibirayetsya yak oznaka kincya ryadka i ryadok zberigayetsya yak poslidovnist bajtiv vid pochatku do kincya Ye sistemi v yakih rol oznaki kincya ryadka vikonuye ne simvol 0 a bajt 0xFF 255 abo kod simvolu Metod maye tri nazvi ASCIIZ abo asciiz simvoli v koduvanni ASCII z nulovim zavershalnim bajtom C strings najbilshogo poshirennya metod otrimav same v movi Si nul terminovanij ryadok angl null terminated string Perevagi vidsutnist dodatkovoyi sluzhbovoyi informaciyi pro ryadok krim zavershalnogo bajtu mozhlivist podannya ryadka bez stvorennya okremogo tipu danih vidsutnist obmezhennya na maksimalnij rozmir ryadka ekonomne vikoristannya pam yati prostota otrimannya sufiksu ryadka prostota peredachi ryadkiv u funkciyi peredayetsya pokazhchik na pershij simvol Nedoliki znachnij chas vikonannya operacij otrimannya dovzhini i konkatenaciyi ryadkiv vidsutnist zasobiv kontrolyu za vihodom za mezhi ryadka v razi poshkodzhennya zavershalnogo bajta mozhlivist poshkodzhennya velikih oblastej pam yati sho mozhe privesti do neperedbachuvanih naslidkiv vtrati danih krahu programi i navit vsiyeyi sistemi nemozhlivist vikoristovuvati simvol zavershalnogo bajtu yak elementa ryadka nemozhlivist vikoristovuvati deyaki koduvannya z rozmirom simvolu v kilka bajt napriklad UTF 16 tomu sho u bagatoh takih simvolah napriklad A 0x0100 odin z bajtiv dorivnyuye nulyu v toj zhe chas koduvannya UTF 8 vilne vid cogo nedoliku Vikoristannya oboh metodiv U takih movah yak napriklad Oberon ryadok rozmishuyetsya v masivi simvoliv pevnoyi dovzhini prichomu yiyi kinec poznachayetsya nulovim simvolom Za zamovchuvannyam ves masiv zapovnenij nulovimi simvolami Takij sposib dozvolyaye ob yednati bagato perevag oboh pidhodiv a takozh uniknuti bilshist yih nedolikiv Podannya u viglyadi spisku Movi Erlang Haskell Prolog vikoristovuyut dlya ryadkovogo tipu spisok simvoliv Cej metod robit movu bilsh teoretichno elegantnoyu za rahunok dotrimannya ortogonalnosti v sistemi tipiv ale prinosit suttyevi vtrati shvidkodiyi Realizaciya v movah programuvannyaU pershih movah programuvannya vzagali ne bulo ryadkovogo tipu programist povinen buv sam buduvati funkciyi dlya roboti z ryadkami togo chi inshogo tipu U Si vikoristovuyutsya nul terminovani ryadki z povnim ruchnim kontrolem z boku programista U standartnomu Paskali ryadok viglyadaye yak masiv z 256 bajtiv pershij bajt zberigav dovzhinu ryadka v inshih zberigayetsya yiyi tilo Takim chinom dovzhina ryadka ne mozhe perevishuvati 255 simvoliv U Borland Pascal 7 0 takozh z yavilisya ryadki po tipu Si ochevidno komu cherez te sho v chislo pidtrimuvanih platform uvijshla Windows U Object Pascal ta C STL ryadok ye chornim yashikom v yakomu vidilennya vivilnennya pam yati vidbuvayetsya avtomatichno bez uchasti programista Pri stvorenni ryadka pam yat vidilyayetsya avtomatichno yak tilki na ryadok ne zalishitsya zhodnogo posilannya pam yat povertayetsya sistemi Perevaga cogo metodu v tomu sho programist ne zamislyuyetsya nad robotoyu ryadkiv Z inshogo boku programist maye nedostatnij kontrol nad robotoyu programi v kritichnih do shvidkosti dilyankah takozh vazhko realizuyetsya peredacha takih ryadkiv yak parametr v DLL Takozh Object Pascal avtomatichno stezhit shob v kinci ryadka buv simvol z kodom 0 Tomu yaksho funkciya vimagaye na vhodi nul terminovanij ryadok dlya konvertaciyi treba prosto napisati PAnsiChar ryadkova zminna abo PWideChar ryadkova zminna dlya Pascal zminna c str dlya Builder STL U C ta inshimi movami iz zbirkoyu smittya ryadok ye nezminnim ob yektom yaksho ryadok potribno modifikuvati stvoryuyetsya inshij ob yekt Cej metod povilnij i vitrachaye chimalo timchasovoyi pam yati ale dobre poyednuyetsya z koncepciyeyu zbirki smittya Perevaga cogo metodu v tomu sho prisvoyuvannya vidbuvayetsya shvidko i bez dublyuvannya ryadkiv Takozh ye deyakij ruchnij kontrol nad konstruyuvannyam ryadkiv v Java napriklad cherez klasi StringBuffer i StringBuilder ce dozvolyaye zmenshiti kilkist vidilen i vivilnen pam yati i vidpovidno zbilshiti shvidkist U deyakih movah napriklad Standard ML krim cogo ye dodatkovij modul dlya zabezpechennya she bilshoyi efektivnosti pidryadok angl substring Jogo vikoristannya dozvolyaye vikonuvati operaciyi nad ryadkami bez kopiyuvannya yihnih til za dopomogoyu manipulyuvannya indeksami pochatku i kincya pidryadka fizichne kopiyuvannya vidbuvayetsya lishe pri neobhidnosti peretvorennya pidryadkiv u ryadki OperaciyiNajprostishi operaciyi z ryadkami Otrimannya simvolu za nomerom poziciyi indeksu v bilshosti mov ce trivialna operaciya Konkatenaciya z yednannya ryadkiv Pohidni operaciyi Otrimannya pidryadka za indeksami pochatku i kincya Perevirka vhodzhennya odnogo ryadka v inshu poshuk pidryadka v ryadku Perevirka na zbig ryadkiv z urahuvannyam abo bez urahuvannya registru simvoliv Otrimannya dovzhini ryadka Zamina pidryadka v ryadku Operaciyi pri traktuvanni ryadkiv yak spiskiv Zgortannya Vidobrazhennya odnogo spisku na inshij Filtraciya spisku za kriteriyem Skladnishi operaciyi Znahodzhennya minimalnogo nadryadka sho mistit vsi zaznacheni ryadki Poshuk v dvoh masivah ryadkiv zbigayutsya poslidovnostej zavdannya pro plagiat Mozhlivi zavdannya dlya ryadkiv na prirodnij movi Porivnyannya na blizkist zaznachenih ryadkiv po zadanomu kriteriyu Viznachennya movi i koduvannya tekstu na pidstavi jmovirnostej simvoliv i skladiv Podannya simvoliv ryadkaDo ostannogo chasu koli odin simvol zavzhdi koduvavsya odnim bajtom 8 dvijkovih bitiv zastosovuvalisya takozh koduvannya z 7 bitami na simvol sho dozvolyalo predstavlyati 256 128 pri semibitnomu koduvanni mozhlivih znachen Odnak dlya povnocinnogo predstavlennya simvoliv alfavitiv kilkoh mov bagatomovnih dokumentiv drukarskih simvoliv kilka vidiv lapok tire kilkoh vidiv progalin i dlya napisannya tekstiv na iyeroglifichnih movah kitajskoyu yaponskoyu ta korejskoyu 256 simvoliv nedostatno Dlya virishennya ciyeyi problemi isnuye kilka metodiv Peremikannya movi keruyuchimi kodami Metod ne standartizovanij i pozbavlyaye tekst samostijnosti tobto poslidovnist simvoliv bez keruyuchogo kodu na pochatku vtrachaye sens vikoristovuvavsya v deyakih rannih rusifikaciyi ZX Spectrum i BK Vikoristannya dvoh abo bilshe bajt dlya predstavlennya kozhnogo simvolu UTF 16 UTF 32 Golovnim nedolikom cogo metodu ye vtrata sumisnosti z poperednimi bibliotekami dlya roboti z tekstom pri podanni ryadka yak ASCIIZ Napriklad kincem ryadka povinen vvazhatisya vzhe ne bajt iz znachennyam 0 a dva abo chotiri pospil nulovih bajti v toj chas yak odinochnij bajt 0 mozhe zustrichatisya v seredini ryadka sho zbivaye biblioteku z panteliku Vikoristannya koduvannya zi zminnim rozmirom simvolu Napriklad v UTF 8 chastina simvoliv predstavlyayetsya odnim bajtom chastina dvoma troma abo chotirma Cej metod dozvolyaye zberegti chastkovu sumisnist zi starimi bibliotekami nemaye simvoliv 0 vseredini ryadka i tomu 0 mozhna vikoristovuvati yak oznaka kincya ryadka ale prizvodit do nemozhlivosti pryamoyi adresaciyi simvolu v pam yati za nomerom jogo poziciyi v ryadku Div takozhRegulyarnij visliv Spisok struktur danih Chastota kadriv Chornij spisok Resursi Windows PrimitkiMejnarovich Yevgen 2010 Anglijsko ukrayinskij slovnik Matematika ta kibernetika Kiyiv Perun Chi pravilno vzhivati strichka v znachenni ryadok Procitovano 12 01 2020 Glushkov V M red 1973 Enciklopediya kibernetiki Kiyiv Gol red Ukrayinskoyi radyanskoyi enciklopediyi http queue acm org detail cfm id 2010365 Arhiv originalu za 25 veresnya 2016 Procitovano 11 grudnya 2016 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya Simon St Laurent Introducing Erlang O Reilly Media Inc 2013 P 62 185 p ISBN 978 1 449 33176 4 http book realworldhaskell org read characters strings and escaping rules html http www swi prolog org pldoc man section text representation Ce nezavershena stattya pro informacijni tehnologiyi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno gruden 2018