Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Теоретична частина. Тип “рядок” (паскалевский String) у с/с++ відсутній

Читайте также:
  1. ЗАГАЛЬНА ЧАСТИНА
  2. ЗАГАЛЬНА ЧАСТИНА
  3. ЗАГАЛЬНА ЧАСТИНА
  4. Констатуюча частина
  5. ОСОБЛИВА ЧАСТИНА
  6. ОСОБЛИВА ЧАСТИНА
  7. Практична частина

Тип “рядок” (паскалевский string) у С/С++ відсутній. Змінні – рядки моделюються масивами символів. Саме такі змінні – масиви і розуміються у С/С++ під поняттям “рядок”. Разом з тим у С++ звичайно створюють новий тип, точніше, клас String, екземпляри якого по способу роботи з ними дуже схожі на паскалевскі рядки. У С/С++ є велика бібліотека функцій для роботи з рядками, що значно спрощує рішення багатьох задач. Ці функції оголошені у файлі <string.h>, дуже часто, коли заводиться програмувати задачу з рядками, виявляється, що ми просто не згадали про корисну функцію <string>.

Робота з рядками природним чином вимагає уміння працювати з текстовими файлами, що складаються з рядків. Є два способи роботи з файлами – “старий”, на основі функцій і структур даних, оголошених у файлі <stdio.h>, і “новий”, орієнтований тільки на С++ і заснований на понятті класу вводу-виводу. Переваги нового способу в тім, що його можна використовувати більш природним чином для нових типів даних. У роботі розглянуто основи нового способу, а старий рекомендується освоїти самостійно, користуючись, наприклад, [2] і [3].

Рядок – літeрал задається в мовах С/С++ як ланцюжок символів, укладений у подвійні лапки. Внутрішнє представлення такого літерала - ланцюжок кодів символів, за якими іде нульовий байт, що є ознакою кінця рядка. Довжина літерала (кількість байтів) – на 1 більше кількості “видимих” символів. Таке представлення рядка називають формат ASCIZ. ASCIZ – кодова таблиця ASCII + нульовий (zero) байт наприкінці. Оскільки практично всі стандартні функції для роботи з рядками орієнтуються на формат ASCIZ, у масивах, що представляють рядки, потрібно забезпечити “кінцевий” нульовий байт. Перевага такого представлення рядків у порівнянні з паскалевським у тім, що немає обмеження на довжину рядків – витрати на визначення довжини рядка. Тепер довжина не зберігається як перший байт рядка, а повинна підраховуватися під час “подорожі” від початку рядка до нульового байта. Приклади визначення рядків:

char sta [50]; /* Рядок з 49 символів + байт для нуль-термінатора*/

char stb [] = “Program”; /* Масив, ініціалізованний рядком-літералом*/

char *msg = “Begin”; /* Покажчик на char, ініціалізованний адресою рядка-літерала */

Пояснимо термін “константа” стосовно до рядків. Змінна sta – це покажчик – константа, у тім сенсі, що область пам'яті, виділену для збереження елементів масиву компілятором, не можна змінити. Тому ж не можна виконувати арифметичні операції, намагаючись змінити значення покажчика sta. Однак, будь-які зміни самих елементів рядка припустимі. Іншими словами, sta=stb; sta=msg; sta++ заборонено, а sta [2] = 's' дозволено. Усе те ж саме можна сказати і про перемінну stb. Для змінної – покажчика дозволено будь-які операції, припустимі для покажчиків, зокрема, msg = 'Б' (одержуємо “Беgіn”), msg++ (msg починає вказувати на 'е' з ”Begin”), msg=stb (msg починає вказувати на ”Program”, а доступ до ”begin” губиться).

Ще більше розмаїтості вносить слово соnst, якщо його використовувати з покажчиками. Розглянемо простий приклад.

const char* pca = “Program”;

char* const pcb = “begin”;

pca [2] = ‘а'; //неприпустимо, тому що саме значення - константа

pcb [1] = 'і'; //припустимо, одержимо “Bigin”

pca = “function”; //припустимо, тому що рса - змінна

pcb = “end”; //неприпустимо, тому що pcb – іменування константи типу char*


Дата добавления: 2015-07-20; просмотров: 71 | Нарушение авторских прав


Читайте в этой же книге: ВАРІАНТИ ЗАВДАНЬ РОБОТИ | Зв’язок між покажчиками та масивами | Покажчики на багатовимірні масиви. | Масиви покажчиків | ЗАВДАННЯ ПО ОБРОБЦІ РЯДКІВ | Директиви препроцесора. | If, #else, #elif, #endif. | Визначені макроси. | КОНТРОЛЬНІ ПИТАННЯ | Особливості типу char |
<== предыдущая страница | следующая страница ==>
Рекомендації зо вибору імен змінних і функцій| Функції для роботи з рядками

mybiblioteka.su - 2015-2024 год. (0.007 сек.)