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

5.2. Побудова символьних рядків

Найчастіше одновимірні масиви використовуються для побудови символьних рядків. У мові програмування C++ рядок визначається як символьний масив, який завершується нульовим символом ('\0'). Під час визначення довжини символьного масиву необхідно враховувати ознаку його завершення, тобто задавати його довжину на одиницю більше довжини найбільшого рядка, які передбачають зберігати у цьому масиві.

Рядок – це символьний масив, який завершується нульовим символом.

5.2.1. Оголошення рядкового літерала

Оголошуючи масив strMas, що призначається для зберігання 10-символьного рядка, потрібно використовувати таку настанову:

char strMas[11];

Заданий тут розмір (11) дає змогу зарезервувати місце для нульового символу в кінці рядка.

Як ми вже зазначали вище, мова програмування C++ дає змогу визначати рядкові літерали. Пригадаємо, що рядковий літерал – це перелік символів, поміщений в подвійні лапки. Ось декілька прикладів:

"Привіт"

"Мені подобається мова програмування C++"

"#$%@@#$"

""

Рядок, наведений останнім (""), називається нульовим. Він складається тільки з одного нульового символу (ознаки завершення рядка). Нульові рядки використовуються для представлення порожніх рядків.

Програмісту не потрібно вручну добавляти в кінець рядкових констант нульові символи. С++-компілятор робить це автоматично. Отже, рядок "Привіт" в пам'яті розміщується так, як це показано на цьому рисунку:

5.2.2. Зчитування рядків з клавіатури

Найпростіше зчитувати рядок з клавіатури, створивши масив, який прийме цей рядок за допомогою настанови cin. Зчитування рядка, введеного користувачем з клавіатури, відображено у наведеному нижче коді програми.

Код програми 5.4. Демонстрація механізму використання cin-настанови для зчитування рядка з клавіатури

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

char strMas[80];

cout << "Введіть рядок: ";

cin >> strMas; // Зчитуємо рядок з клавіатури.

cout << "Ось Ваш рядок: ";

cout << strMas;

getch(); return 0;

}

Хоча ця програма формально коректна, однак вона не позбавлена недоліків. Розглянемо такий результат її виконання:

Введіть рядок: Це перевірка

Ось Ваш рядок: Це

Як бачимо, під час виведення рядка, введеного з клавіатури, програма відображає тільки слово "Це", а не весь рядок. Йдеться про те, що оператор "<<" припиняє зчитування рядка, як тільки трапляється символ пропуску, табуляції або нового рядка (називатимемо ці символи пропускними). Для вирішення цього питання можна використовувати ще одну бібліотечну функцію gets(). Загальний формат її виклику є таким:

gets(ім'я_масиву);

Якщо у програмі необхідно зчитувати рядок з клавіатури, то викличте функцію gets(), а як аргумент передайте ім'я масиву, не вказуючи індексу. Після виконання цієї функції заданий масив міститиме текст, введений з клавіатури. Функція gets() зчитує символи, що вводяться користувачем, доти, доки він не натисне на клавішу <Enter>. Для виклику функції gets() у програму необхідно включити заголовок <cstdio>.

У наведеній нижче версії попередньої програми продемонстровано механізм використання функції gets(), яка дає змогу ввести в масив рядок символів, що містить пропуски.

Код програми 5.5. Демонстрація механізму використання функції gets() для зчитування рядка з клавіатури

#include <iostream> // Для потокового введення-виведення

#include <cstdio> // Для підтримки системи введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

char strMas[80];

cout << "Введіть рядок: ";

gets(strMas); // Зчитуємо рядок з клавіатури.

cout << "Ось Ваш рядок: ";

cout << strMas;

getch(); return 0;

}

Цього разу після запуску нової версії програми на виконання і введення з клавіатури тексту "Це простий тест" рядок зчитується повністю, а потім так само повністю і відображається:

Введіть рядок: Це простий тест

Ось Ваш рядок: Це простий тест

У цій програмі звернемо Вашу увагу на таку настанову:

cout << strMas;

У цьому записі (замість звичного літерала) використовують ім'я рядкового масиву. І хоча причина такого використання настанови cout нам стане зрозумілою після вивчення ще декількох розділів цього навчального посібника, поки що стисло зазначимо, що ім'я символьного масиву, який містить рядок, можна використовувати скрізь, де допустимо застосування рядкового літерала. При цьому майте на увазі, що ні оператор "<<", ні функція gets() не виконують граничної перевірки (на відсутність порушення меж масиву). Тому, якщо користувач введе рядок, довжина якого перевищує розмір масиву, то можливі неприємності, про які згадувалося вище. Із сказаного виходить, що обидва описаних тут варіанти зчитування рядків з клавіатури є потенційно небезпечними. Проте, після докладного розгляду С++-можливостей введення-виведення в розд. 19, ми дізнаємося про способи, що дають змогу обійти цю проблему.