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

  Юрій  | 

  Оновл. 15 Тра 2020  | 

 175

Вашою першою програмою на мові C++, ймовірно, було:

Чи не так? Але що таке 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 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

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

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