Читайте также: |
|
Тип “рядок” (паскалевский 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Рекомендації зо вибору імен змінних і функцій | | | Функції для роботи з рядками |