Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsiyi_C_II_sem.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.52 Mб
Скачать

Змішування рядкового та числового вводу

Змішування числового і рядкового введення може призводити до проблем. Розглянемо приклад простої програми в лістингу 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:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]