Урок №60. Введення в std::string

  Юрій  | 

  Оновл. 19 Сер 2021  | 

 366

Вашою першою програмою на мові C++, ймовірно, була всім відома програма “Hello, world!”:

Чи не так? Але що таке Hello, world!? Hello, world! — це послідовність символів або просто рядок (англ. “string”). У мові C++ ми використовуємо рядки для представлення тексту (імен, адрес, слів і речень). Рядкові літерали (такі як Hello, world!) пишуться в подвійних лапках.

Оскільки їх часто використовують в програмах, то більшість сучасних мов програмування мають вбудований тип даних string. У мові C++ також є цей тип, але не як основна частина мови, а як частина Стандартної бібліотеки С++.

Тип даних string

Щоб мати можливість використовувати рядки в мові C++, спочатку необхідно підключити заголовок string. Як тільки це буде зроблено, ми зможемо визначити змінні типу string:

Як і зі звичайними змінними, ми можемо ініціалізовувати змінні типу string або присвоювати їм значення:

Рядки також можуть містити числа:

Варто відзначити, що числа, які присвоюються, тип string обробляє як текст, а не як числа. А це означає, що ними не можна маніпулювати як звичайними числами (наприклад, ви не зможете виконати з ними арифметичні операції). Мова C++ автоматично НЕ конвертує їх в значення цілочисельних типів данів або типів з плаваючою крапкою.

Ввід/вивід рядків

Рядки можна виводити за допомогою std::cout:

Результат виконання програми:

My name is Sasha

А ось з std::cin справи йдуть трохи інакше. Розглянемо наступний приклад:

Результат виконання програми:

Enter your full name: Sasha Mak
Enter your age: Your name is Sasha and your age is Mak

Хм, щось не так! Що ж трапилося? Виявляється, оператор виводу (>>) повертає символи з вхідного потоку даних тільки до першого пробілу. Всі інші символи залишаються всередині std::cin, очікуючи наступного вилучення.

Тому, коли ми використали оператор >> для вилучення даних в змінну myName, тільки Sasha вдалося витягнути, Mak залишився всередині std::cin, очікуючи наступного вилучення. Коли ми використали оператор >> знову, щоб витягнути дані в змінну myAge, ми отримали Mak замість 25. Якби ми виконали третє вилучення, то отримали б 25.

Використання std::getline()

Щоб витягнути цілий рядок з вхідного потоку даних (разом з пробілами), використовуйте функцію std::getline(). Вона приймає два параметри: перший — std::cin, другий — змінна типу string.

Ось вищенаведена програма, але вже з використанням std::getline():

Тепер програма працює правильно:

Enter your full name: Sasha Mak
Enter your age: 25
Your name is Sasha Mak and your age is 25

Використання std::getline() з std::cin

Вилучення даних з std::cin за допомогою std::getline() іноді може призвести до несподіваних результатів. Наприклад, розглянемо наступну програму:

Можливо, ви здивуєтеся, але коли ви запустите цю програму, і вона попросить вас ввести ваше ім’я, вона не чекатиме вашого вводу, а відразу виведе результат (просто пробіл замість вашого імені)!

Пробний запуск програми:

Pick 1 or 2: 2
Now enter your name: Hello, , you picked 2

Чому так? Виявляється, коли ви вводите числове значення, потік cin захоплює разом з вашим числом і символ нового рядка. Тому, коли ми ввели 2, cin фактично отримав 2\n. Потім він витягнув значення 2 в змінну, залишаючи \n (символ нового рядка) у вхідному потоці. Потім, коли std::getline() отримує дані для myName, він бачить в потоці \n і думає, що ми, мабуть, ввели просто порожній рядок! А це, безумовно, не те, що ми хочемо.

Хорошою практикою вважається видаляти з вхідного потоку даних символ нового рядка. Це можна зробити наступним чином:

Якщо ми вставимо цей рядок безпосередньо після отримання вхідних даних, то символ нового рядка буде видалено з вхідного потоку, і програма працюватиме належним чином:

Правило: При вводі числових значень не забувайте видаляти символ нового рядка з вхідного потоку даних за допомогою std::cin.ignore().

Додавання рядків

Ви можете використовувати оператор + для об’єднання двох рядків або оператор += для додавання двох рядків.

У наступній програмі ми протестуємо ці два оператори, а також покажемо, що відбудеться, якщо ви спробуєте використати оператор + для додавання двох числових рядків:

Результат виконання програми:

4412
44 cats

Зверніть увагу, оператор + об’єднав два числових рядки в один (44 + 12 = 4412). Він не додавав ці рядки як числа.

Довжина рядків

Щоб дізнатися довжину рядка, ми можемо зробити наступне:

Результат виконання програми:

Sasha has 5 characters

Зверніть увагу, замість запиту довжини рядка як length(myName), ми пишемо myName.length().

Функція запиту довжини рядка не є звичайною функцією, як ті, що ми використовували раніше. Це особливий тип функції класу std::string, який називається методом. Ми поговоримо про це детально, коли будемо розглядати тему класів.

Тест

Напишіть програму, яка просить у користувача ввести ім’я, прізвище та вік. В результаті вкажіть користувачеві, скільки років він прожив на кожну букву з його імені та прізвища (щоб було простіше, враховуйте також пробіли), наприклад:

Enter your full name: Tom Cats
Enter your age: 45
You've lived 5.625 years for each letter in your name.

Уточнення: Вік 45 ділиться на Tom Cats (8 букв, враховуючи пробіл), що дорівнює 5.625.

Відповідь

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (6 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *