Використання текстової інформації під час роботи з базами даних, файлами, для отримання і відправлення повідомлень, є невід'ємною частиною роботи кожного програміста.
рядки застосовуються, як для внутрішніх цілей (налагодження і тестування коду), так і для вирішення спільних завдань, передачі даних клієнта, оформлення графічного інтерфейсу. Зважаючи на це слід приділити особливу увагу тому, як побудовані рядки в мові С ++, як працювати з їх базовими операції і які методи обробки об'єктів типу string швидше, або доцільніше в тій чи іншій ситуації.
Рядки в мові C ++ можуть являти собою масиви символів char – це вбудований тип, який застосовувався в С. Або екземпляри класу string, який включений в стандартну бібліотеку С ++. Варто зауважити, що при створенні об'єкта даного типу ми практично отримуємо динамічно змінюється масив, т.е. той, якому немає необхідності ставити початкові розміри, оскільки вони можуть змінюватися в процесі роботи з сутністю.
У першому випадку рядок розміщується в пам'яті, як масив. Через покажчик типуchar здійснюється доступ до неї. Даний підхід загрожує помилками і є досить складним, оскільки реалізований на низькому рівні.
об'єкти класу string полегшують роботу, через них можна отримати доступ до стандартних операцій над рядками. Вони ж входять в простір імен СТЛ (Стандартна бібліотека шаблонів). Для подальшого використання стандартних бібліотек З необхідно підключити заголовний файл:
1 | #include <cstring> |
Найпростішим прикладом використання змінної рядкового типу буде виведення її на екран. Але ускладнити завдання і спробуємо, для начала, вважати значення рядка, а після її оперувати.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <iostream> #include <string> using namespace std; int main() { string myString; // создаем переменную, в которую поместим строку cout << "What is your name? "; getline(cin, myString); // считываем введенную строку cout << "Hey, " << myString << "! \n"; // выводим значение переменной на экран } |
методgetline() дозволяє зчитувати дані з потокуcin, а також записувати їх в змінну, яка вказується після коми.
В разі, коли необхідно ініціалізувати змінну під час її створення, слід використовувати наступний синтаксис:
1 | string oneMoreString = "Here is my new string!"; |
Розглянемо базові методи класу string, які дозволяють модифікувати рядки і отримувати інформацію про їх параметрах.
Для отримання довжини рядка можна застосовувати два методи. Один з них size() інший довжина(). Обидва методи повертають чисельну кількість символів. Але слід зауважити, що нумерація елементів в строковому масиві все одно починається з 0.
Лістинг для перевірки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> #include <string> using namespace std; int main() { string myString; cout << "What is your name? "; getline(cin, myString); cout << "Hey, " << myString << "! \n"; cout << "Size is " << myString.size() << "\n"; cout << "Length is " << myString.length() << "\n"; } |
Далі ми бачимо, що обидва методи повертають однакові значення.
Для перевірки строкової змінної на наявність даних в ній використовується функція empty(), яка повертає логічне значення ( 0 если false или 1 если true). Дана операція корисна, коли необхідно себе убезпечити від втрати даних.
Щоб обнулити малу змінну застосовується методясно(). В результаті після його виконання myString.size() вернет 0, аmyString.empty() – значение true, т.е. 1.
Лістинг коду для перевірки функцій:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> #include <string> using namespace std; int main() { string myString = "Not a bug, but a feature!"; cout << "Is empty? " << myString.empty() << "\n"; cout << "Size is " << myString.size() << "\n"; cout << "Clear it all! \n"; myString.clear(); // удаляем данные cout << "Is empty now? " << myString.empty() << "\n"; cout << "Size is " << myString.size() << "\n"; } |
Тепер розглянемо менш тривіальні операції, які дозволять заощадити час і зусилля програмістів, а також уникнути використання масивних циклів для перебору кожного значення строкового масиву.
Функцияpush_back (char) дозволяє додати в кінець поточного рядка будь-який символ типу char. При этом, нам немає необхідності пересохранять нове значення рядка, стару змінну просто буде модифікованої.
клас string дозволяє маніпулювати двома рядками одночасно, записуючи значення з однієї в іншу. Для цього на об'єкті рядки слід викликати методвставити (INT startInResultString, рядок з, INT startInSourceString, int amount). деstartInResultString – стартова позиція осередки в рядку, в яку проводиться запис нових даних, т.е. нові значення будуть розміщуватися починаючи з цього індексу.
рядкова зміннавід – являє собою рядок з якої беруться дані, далі всі параметри відносяться саме до неї. Початкове значення індексу з якого почнеться копіювання даних позначеноstartInSourceString. Загальна кількість символів, які будуть скопійовані з рядкавідпозначеноamount, відлік проводиться починаючи зі стартового індексу.
Лістинг коду дозволить краще розібратися зі вхідними параметрами функції.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream> #include <string> using namespace std; int main() { string myString1 = "Not a bug, But a feature!"; string myString2 = " said a developer."; cout << myString1 << "\n"; cout << myString2 << "\n"; myString1.insert(10, myString2, 0, 20); cout << myString1; } |
Були розібрані не всі, але найбільш часто-використовуваних функцій для роботи із строковими об'єктами. перевага класу string складається в простоті використання і підтримки великої кількості методів. Проте, строкові об'єкти обробляються повільно. У деяких випадках може трапитися втрата даних або розрив цілісності рядка, яку потім можна буде ніяк вивести і перевірити візуально.
експериментуйте – створіть об'єкт класу string і викликайте його методи по-черзі. Намагайтеся самі розібратися, що вони роблять і як працюють. У багатьох підручниках пропонується самостійно написати свій власний (звичайно ж приборканий) класс для роботи з рядками. Це зовсім нескладно і ви відмінно розберетеся з тим, як влаштований справжній клас string. Ми підготуємо для вас кілька завдань, для закріплення цього матеріалу.
Обов'язково подивіться відео по темі клас (автор Денис Марков):
Відео про те як створити свій клас String допоможе розібратися, як все влаштовано:
гарна стаття, може краща у всьому циклі статей – по збалансованості детальності і простоті викладу.
тільки незрозуміло, чому всюди в тексті клас називається String (з великої букви), якщо навіть в прикладах він скрізь використовується як string (з маленької букви). Якщо ви напишете String в коді, то тут же отримаєте грубу синтаксичну помилку.
Ще добре б згадати, хоча б побіжно (або окремою темою в продовження, “використання string”?):
1. що з string завжди можна “Вилучити” більш звичне уявлення char * (в стилі C) c_str методом():
покажчик на рядок = “ххх”;
символ * з = s.c_str();
2. про перевизначених операціях + = і + для string, як конкатенація рядків:
Рядок ч = “Здравствуйте “, ш = “світ”;
cout << годину + вага << endl;
ч + = ш;
cout << годину << endl;
3. про цілої великої групи методів-уявлення рядків для зображення числових значень:
рядок d( "123" ), f( "1.23" );
довго я = d.stoul();
пливуть г = d.stof();
І останнє … зауваження:
> Обидва методи повертають чисельну кількість символів.
довжина() і розмір() повертають не кількість символів, а кількість байт у вмісті рядка. для ASCII (англійських) символов – це одне і теж. Але для російських (та інших мов) – нет, і залежить від використовуваного кодування.
string priv( "привет!" );
, в залежності від того, в якому редакторі і якому кодуванні працюєте з кодом програми.cout << priv.size( ) << " | " << priv.length( );
Точні значення тут не важливі… Але важливо знати, що length() і розмір() для російських рядків не дають передбачуване число символів, що може породжувати важко знаходять помилки!
Олег, спасибі за доповнення до статті.
… з'їла, гидоту, кілька рядків прикладу!
Але має бути зрозуміло, що довжина “вітання!” буде дорівнює 13.
#include
#include
using namespace std;
int main()
{
рядок туЗЬптд; // створюємо змінну, в яку помістимо рядок
cout << "What is your name? ";
getline(cin, MyString); // зчитуємо введений рядок
cout << "Hey, " << MyString << "! \n"; // виводимо значення змінної на екран
}
У мене чомусь getline(cin, MyString); НЕ делать
перепрошую, що не в
hydc8j