
- •Лекція 1
- •Зауваження до програми
- •Правила ініціалізації масивів
- •Лекція 2
- •Конкатенація рядкових літералів
- •Використання рядків у масивах
- •Зауваження до програми
- •Ризики, пов'язані з введенням рядків
- •Читання введення по рядках
- •Введення, орієнтоване на рядки за допомогою getline()
- •Введення, орієнтоване на рядки за допомогою get()
- •Змішування рядкового та числового вводу
- •Клас string
- •Лекція 3
- •Використання структур в програмах
- •Зауваження до програми
- •Чи може структура містити член типу string?
- •Інші властивості структур
- •Масиви структур
- •Лекція 4
- •Перерахування
- •Встановлення значень нумераторам
- •Діапазони значень нумераторів
- •Лекція 5
- •Оголошення та ініціалізація вказівників
- •Небезпека пов’язана з вказівниками
Змішування рядкового та числового вводу
Змішування числового і рядкового введення може призводити до проблем. Розглянемо приклад простої програми в лістингу 6:
Результат виконання програми:
Ви так і не отримали можливості ввести адресу. Проблема в тому, що коли cin читає рік, то залишає символ нового рядка, згенерований натисканням <Enter>, у вхідній черзі. Потім cin.getline() читає символ нового рядка просто як порожній рядок, після чого привласнює масиву address нульову рядок. Щоб виправити це, потрібно перед читанням адреси прочитати і відкинути символ нового рядка. Це може бути зроблено декількома способами, включаючи виклик get() без аргументів або з аргументом char. Ці виклики можна виконати окремо:
Або ж можна зчепити виклик, скориставшись тим фактом, що вираз cin>>year повертає об'єкт cin:
Якщо внести одне з таких виправлень до лістингу 6, програма стане працювати правильно:
Клас string
У стандарті ISO/ANSI C++ 98 бібліотека C++ була розширена за рахунок додавання класу string. Тож відтепер замість використання символьних масивів для зберігання рядків можна застосовувати змінні типу string (або, користуючись термінологією C++, об'єкти). Як ви побачите, клас string простіше у використанні, ніж масив, і до того ж пропонує більш природне уявлення рядка як типу.
Для роботи з класом string в програмі потрібно включити заголовковий файл string. Клас string є частиною простору імен std, тому ви повинні вказати директиву using або оголошення або ж посилатися на клас як std::string. Визначення класу приховує природу рядка як масиву символів і дозволяє трактувати його як звичайну змінну. У лістингу 7 проілюстровані деякі подібності та відмінності між об'єктами string і символьними масивами:
Приклад виконання програми:
З цього прикладу ви повинні зробити висновок, що у багатьох відношеннях об'єкт string можна використовувати так само, як символьний масив.
Об'єкт string можна ініціалізувати рядком у стилі С.
Щоб зберегти клавіатурний ввід в об'єкті string, можна використовувати СІП.
Для відображення об'єкта string можна застосовувати cout.
Можна використовувати нотацію масивів для доступу до індивідуальних символам, що зберігаються в об'єкті string.
Головна відмінність між об'єктами string і символьними масивами, продемонстрована в лістингу 7, полягає в тому, що об'єкт string оголошується як звичайна змінна, а не масив:
Проектне рішення, покладене в основу класу, дозволяє програмі автоматично обробляти зміну розміру рядків. Наприклад, оголошення str1 створює об'єкт string нульової довжини, але при читанні введення в str2 програма автоматично його збільшує:
Це робить використання об'єкта string більш зручним і безпечним порівняно з масивом. Концептуально важливим є те, що масив рядків - це колекція одиниць зберігання окремих символів, що служать для збереження рядка, а клас string - єдина сутність, що представляє рядок.
Ініціалізація рядків в С++ 11
Як і можна було очікувати, C++ 11 дозволяє здійснювати спискову ініціалізацію для рядків у стилі С і об'єктів string:
Присвоювання, конкатенація та додавання
Деякі операції з рядками клас string виконує простіше, ніж це можливо у випадку символьних масивів. Наприклад, просто привласнити один масив іншому не можна. Однак один об'єкт string цілком можна присвоїти іншому:
Клас string спрощує комбінування рядків. За допомогою операції + можна скласти два об'єкти string разом, а за допомогою операції += Можна додати рядок до існуючого об'єкту string. Відносно попереднього коду у нас є такі можливості:
У лістингу 8 наведено відповідний приклад. Зверніть увагу, що складати і додавати до об'єктів string можна як інші об'єкти string, так і рядки в стилі С.
Лістинг 8. strtype.cpp
Згадайте, що керуюча послідовність \" представляє подвійні лапки, використовувану як літеральний символ, а не обмежувач рядка. Нижче показано виведення програми з лістингу 8: