Робота з рядками. Клас string. Конструктори класу. Функції assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Приклади
Зміст
- 1. Для чого призначений клас string у програмах на C++?
- 2. Які модулі (бібліотеки) потрібно підключити, щоб використовувати можливості класу string у MS Visual Studio C++?
- 3. Яким чином здійснюється оголошення змінної типу string? Приклади
- 4. Які переваги та недоліки дає використання класу string у порівнянні з типом char*?
- 5. Які оператори можна використовувати з об’єктами класу string?
- 6. Чи містить клас string конструктори?
- 7. Приклади ініціалізації з допомогою конструкторів
- 8. Присвоювання рядків. Функція assign(). Приклади
- 9. Об’єднання рядків. Функція append(). Приклад
- 10. Вставка символів у рядку. Функція insert(). Приклад
- 11. Заміна символів у рядку. Функція replace(). Приклад
- 12. Видалення заданої кількості символів з рядка. Функція erase(). Приклад
- 13. Пошук символу в рядку. Функції find() та rfind(). Приклади
- 14. Порівняння частин рядків. Функція compare(). Приклад
- 15. Отримання рядка з символом закінчення рядка ‘\0’ (char *). Функція c_str(). Приклад
- 16. Як визначити довжину рядка типу string? Функція length()
- Зв’язані теми
Пошук на інших ресурсах:
1. Для чого призначений клас string у програмах на C++?
Клас string призначений для роботи з рядками типу char*, який представляє собою рядок з завершаючим нулем. Клас string був введений як альтернативний варіант для роботи з рядками типу char*. Рядки, які завершуються символом ‘\0’ ще називаються C-рядками. Оскільки, string є класом, то можна оголошувати об’єкти цього класу.
2. Які модулі (бібліотеки) потрібно підключити, щоб використовувати можливості класу string у MS Visual Studio C++?
Щоб використовувати можливості типу string в MS Visual Studio (C++), потрібно підключити бібліотеку <string> та простір імен std.
#include <string> using namespace std;
3. Яким чином здійснюється оголошення змінної типу string? Приклади
Оголошення змінної типу string здійснюється так само як і звичайної. Можливий варіант оголошення з одночасною ініціалізацією.
// тип string string s1; // змінна з іменем s1 типу string string s2 = "This is a string variable"; // оголошення з ініціалізацією // використання змінної типу string з оператором присвоєння s1 = s2; // s1 = "This is a string variable" s2 = "New text";
4. Які переваги та недоліки дає використання класу string у порівнянні з типом char*?
Створення нового типу string було обумовлене недоліками роботи з рядками символів, що демонстрував тип char*. У порівнянні з типом char* тип string має такі основні переваги:
- можливість обробки рядків стандартними операторами C++ (=, +, ==, <> тощо). Як відомо, при використанні типу char* навіть найбільш прості операції з рядками виглядали складно і вимагали написання надмірного програмного коду;
- забезпечення кращої надійності (безпеки) програмного коду. Наприклад, при копіюванні рядків, тип string забезпечує відповідні дії, що можуть виникнути у випадку, якщо рядок-джерело має більший розмір за рядок-приймач;
- забезпечення рядка, як самостійного типу даних. Оголошення типу string як рядка є єдине для усіх змінних в програмі, що забезпечує непротирічність даних.
Основним недоліком типу string у порівнянні з типом char*, є уповільнена швидкість обробки даних. Це зв’язано з тим, що тип string – це, фактично, контейнерний клас. А робота з класом вимагає додаткової реалізації програмного коду, що, в свою чергу займає зайвий час.
5. Які оператори можна використовувати з об’єктами класу string?
Клас string є зручний тим, що дозволяє зручно маніпулювати рядками, використовуючи стандартні (перевантажені) оператори.
З об’єктами класу string можна використовувати такі оператори
- = – присвоювання
- + – конкатенація
- += – присвоювання з конкатенацією
- == – рівність
- != – нерівність
- < – менше
- <= – менше або рівне
- > – більше
- >= – більше або рівне
- [ ] – індексація
Приклад, що демонструє використання вищенаведених операторів
// тип string операції над рядками string s1 = "s-1"; string s2 = "s-2"; string s3; bool b; // операція '=' (присвоєння рядків) s3 = s1; // s3 = "s-1" // операція '+' - конкатенація рядків s3 = s3 + s2; // s3 = "s-1s-2" // операція '+=' - присвоювання з конкатенацією s3 = "s-3"; s3 += "abc"; // s3 = "s-3abc" // операція '==' - порівняння рядків b = s2==s1; // b = false b = s2=="s-2"; // b = true // операція '!=' - порівняння рядків (не дорівнює) s1 = "s1"; s2 = "s2"; b = s1 != s2; // b = true // операції '<' та '>' - порівняння рядків s1 = "abcd"; s2 = "de"; b = s1 > s2; // b = false b = s1 < s2; // b = true // операції '<=' та '>=' - порівняння рядків (менше або рівне, більше або рівне) s1 = "abcd"; s2 = "ab"; b = s1 >= s2; // b = true b = s1 <= s2; // b = false b = s2 >= "ab"; // b = true // операція [] - індексація char c; s1 = "abcd"; c = s1[2]; // c = 'c' c = s1[0]; // c = 'a'
6. Чи містить клас string конструктори?
Як і будь-який клас, клас string має ряд конструкторів. Основні з них наступні:
string(); string(const char * str); string(const string & str);
7. Приклади ініціалізації з допомогою конструкторів
Нижче наведено приклади ініціалізації змінних типу string
string s1("Hello!"); // ініціалізація - конструктор string(const char * str) string s2 = "Hello!"; // ініціалізація - конструктор string(const char * str) char * ps = "Hello"; string s3(ps); // ініціалізація string s4(s3); // ініціалізація - конструктор string(const string & str) string s5; // ініціалізація - конструктор string()
8. Присвоювання рядків. Функція assign(). Приклади
Щоб присвоїти один рядок іншому, можна застосувати один з двох методів:
- використати оператор присвоювання ‘=’;
- використати функцію assign() з класу string.
Функція assign() має декілька перевантажених реалізацій.
Перший варіант – це виклик функції без параметрів
string &assign(void);
У цьому випадку відбувається просте присвоєння одного рядка іншому.
Другий варіант дозволяє копіювати задану кількість символів з рядка:
string &assign(const string &s, size_type st, size_type num);
де
- s – об’єкт, з якого береться вихідний рядок або просто вихідний рядок;
- st – індекс (позиція) в рядку, з якої починається копіювання num символів;
- num – кількість символів, які потрібно скопіювати з позиції st;
- size_type – порядковий тип даних.
Третій варіант функції assign() копіює у викликаючий об’єкт перші num символів рядка s:
string & assign(const char * s, size_type num);
де
- s – рядок, в кінці якого є символ ‘\0’;
- num – кількість символів, які копіюються у викликаючий об’єкт. Копіюються перші num символів з рядка s.
Нижче наводиться приклад з різними реалізаціями функції assign().
Приклад.
// присвоювання рядків, функція assign() string s1 = "bestprog.net"; string s2; string s3; char * ps = "bestprog.net"; s3 = s1; // s3 = "bestprog.net" s2.assign(s1); // s2 = "bestprog.net" s2.assign(s1, 0, 4); // s2 = "best" s2.assign(ps, 8); // s2 = "bestprog"
9. Об’єднання рядків. Функція append(). Приклад
Для об’єднання рядків використовується функція append(). Для додавання рядків також можна використати операцію ‘+’, наприклад:
string s1; string s2; s1 = "abc"; s2 = "def"; s1 = s1 + s2; // s1 = "abcdef"
Однак, функція append() добре підходить, якщо потрібно додавати частину рядка.
Функція має такі варіанти реалізації:
string &append(const string & s, size_type start); string &append(const char * s, size_type num);
У першому варіанті реалізації функція отримує посилання на рядковий об’єкт s, який додається до викликаючого об’єкту. У другому варіанті реалізації функція отримує покажчик на рядок типу const char*, який завершується символом ‘\0’.
Приклад. Демонстрація роботи функції append().
string s1 = "abcdef"; string s2 = "1234567890"; s1.append(s2, 3, 4); // s1 = "abcdef4567" char * ps = "1234567890"; s1 = "abcdef"; s1.append(ps, 3); // s1 = "abcdef123"
10. Вставка символів у рядку. Функція insert(). Приклад
Щоб вставити один рядок у задану позицію іншого рядка потрібно використати функцію insert(), яка має декілька варіантів реалізації.
Перший варіант функції дозволяє вставити повністю увесь рядок s в задану позицію start викликаючого рядка:
string &insert(size_type start, const string &s);
Другий варіант функції дозволяє вставити частину (параметри insStart, num) рядка s в задану позицію start викликаючого рядка:
string &insert(size_type start, const string &s, size_type insStart, size_type num);
У вищенаведених функціях:
- s – рядок, що вставляється у викликаючий рядок;
- start – позиція у викликаючому рядку, з якої здійснюється вставка рядка s;
- insStart – позиція у рядку s, з якої відбувається вставка;
- num – кількість символів у рядку s, що вставляються з позиції insStart.
string s1 = "abcdef"; string s2 = "1234567890"; s1.insert(3, s2); // s1 = "abc"+"1234567890"+"def"="abc1234567890def" s2.insert(2, s1, 1, 3); // s2 = "12bcd34567890"
11. Заміна символів у рядку. Функція replace(). Приклад
Функція replace() виконує заміну символів у викликаючому рядку. Функція має такі варіанти реалізації:
string &replace(size_type start, size_type num, const string &s); string &replace(size_type start, size_type num, const string &s, size_type replStart, size_type replNum);
У першому варіанті реалізації викликаючий рядок замінюється рядком s. Є можливість задати позицію (start) та кількість символів (num) у викликаючому рядку, які потрібно замінити рядком s.
Другий варіант функції replace() відрізняється від першого тим, що дозволяє замінювати викликаючий рядок тільки частиною рядка s. У цьому випадку задаються два додаткові параметри: позиція replStart та кількість символів у рядку s, які утворять підрядок що замінить викликаючий рядок.
Приклад. Демонстрація роботи функції replace().
string s1 = "abcdef"; string s2 = "1234567890"; s2.replace(2, 4, s1); // s2 = "12abcdef7890" s2 = "1234567890"; s2.replace(3, 2, s1); // s2 = "123abcdef67890" s2 = "1234567890"; s2.replace(5, 1, s1); // s2 = "12345abcdef7890" // заміна символів, функція replace() string s1 = "abcdef"; string s2 = "1234567890"; s2.replace(2, 4, s1); // s2 = "12abcdef7890" s2 = "1234567890"; s2.replace(3, 2, s1); // s2 = "123abcdef67890" s2 = "1234567890"; s2.replace(5, 1, s1); // s2 = "12345abcdef7890" s2 = "1234567890"; s2.replace(5, 1, s1, 2, 3); // s2 = "12345cde7890" s2 = "1234567890"; s2.replace(4, 2, s1, 0, 4); // s2 = "1234abcd7890"
12. Видалення заданої кількості символів з рядка. Функція erase(). Приклад
Для видалення символів з викликаючого рядка використовується функція erase():
string & erase(size_type index=0, size_type num = npos);
де
- index – індекс (позиція), з якого потрібно видалити символи у викликаючому рядку;
- num – кількість символів, що видаляються.
Приклад.
string s = "01234567890"; s.erase(3, 5); // s = "012890" s = "01234567890"; s.erase(); // s = ""
13. Пошук символу в рядку. Функції find() та rfind(). Приклади
У класі string пошук рядка у підрядку можна робити двома підходами (способами), які відрізняються напрямком:
- шляхом перегляду рядка з початку до кінця з допомогою функції find();
- шляхом перегляду рядка з кінця до початку функція rfind().
Прототип функції find() має вигляд:
size_type find(const string &s, size_type start = 0) const;
де
- s – підрядок, що шукається в рядку, який викликає дану функцію. Функція здійснює пошук першого входження рядка s. Якщо підрядок s знайдено у рядку, що викликав дану функцію, тоді повертається позиція першого входження. У противному випадку повертається -1;
- start – позиція, з якої здійснюється пошук.
Прототип функції rfind() має вигляд:
size_type rfind(const string &s, size_type start = npos) const;
де
- s – підрядок, що потрібно знайти у викликаючому рядку. Пошук підрядка в рядку здійснюється з кінця до початку. Якщо підрядок s знайдено у викликаючому рядку, то функція повертає позицію першого входження. У противному випадку функція повертає
-1; - npos – позиція останнього символу викликаючого рядка;
- start – позиція, з якої здійснюється пошук.
Приклад 1. Фрагмент коду, що демонструє результат роботи функції find()
// тип string, функція find() string s1 = "01234567890"; string s2 = "345"; string s3 = "abcd"; int pos; pos = s1.find(s2); // pos = 3 pos = s1.find(s2, 1); // pos = 3 pos = s1.find("jklmn", 0); // pos = -1 pos = s1.find(s3); // pos = -1 pos = s2.find(s1); // pos = -1
Приклад 2. Демонстрація роботи функції rfind().
// тип string, функції find() та rfind() string s1 = "01234567890"; string s2 = "345"; string s3 = "abcd"; string s4 = "abcd---abcd"; int pos; pos = s1.rfind(s2); // pos = 3 pos = s1.rfind(s2, 12); // pos = 3 pos = s1.rfind(s2, 3); // pos = 3 pos = s1.rfind(s2, 2); // pos = -1 pos = s2.rfind(s1); // pos = -1 pos = s1.rfind(s3, 0); // pos = -1 // різниця між функціями find() та rfind() pos = s4.rfind(s3); // pos = 7 pos = s4.find(s3); // pos = 0
14. Порівняння частин рядків. Функція compare(). Приклад
Оскільки тип string є класом, то, щоб порівняти два рядки між собою можна використати операцію ‘= =’. Якщо два рядки однакові, то результат порівняння буде true. У противному випадку, результат порівняння буде false.
Але, якщо потрібно порівняти частину одного рядка з іншим, то для цього передбачена функція compare().
Прототип функції compare():
int compare(size_type start, size_type num, const string &s) const;
де
- s – рядок, що порівнюється з викликаючим рядком;
- start – позиція (індекс) у рядку s, з якої починається перегляд символів рядка для порівняння;
- num – кількість символів у рядку s, що порівнюються з викликаючим рядком.
Функція працює наступним чином. Якщо викликаючий рядок менше рядка s, то функція повертає -1 (від’ємне значення). Якщо викликаючий рядок більше рядка s, функція повертає 1 (додатне значення). Якщо два рядка рівні, функція повертає 0.
Приклад. Демонстрація роботи функції compare():
// тип string, функція compare() string s1 = "012345"; string s2 = "0123456789"; int res; res = s1.compare(s2); // res = -1 res = s1.compare("33333"); // res = -1 res = s1.compare("012345"); // res = 0 res = s1.compare("345"); // res = -1 res = s1.compare(0, 5, s2); // res = -1 res = s2.compare(0, 5, s1); // res = -1 res = s1.compare(0, 5, "012345"); // res = -1 res = s2.compare(s1); // res = 1 res = s2.compare("456"); // res = -1 res = s2.compare("000000"); // res = 1
15. Отримання рядка з символом закінчення рядка ‘\0’ (char *). Функція c_str(). Приклад
Щоб отримати рядок, який закінчується символом ‘\0’ використовується функція c_str().
Прототип функції:
const char * c_str() const;
Приклад 1. Перетворення типу string в const char *.
// тип string, функція c_str() string s = "abcdef"; const char * ps; ps = s.c_str(); // ps = "abcdef"
Приклад 2.
Нижче продемонстровано переведення рядка з string у тип System::String для відображення його в елементі управління типу Label для додатків типу Windows Forms Application.
// тип string, функція c_str() string s = "abcdef"; String ^ss; ss = gcnew String(s.c_str()); // конвертування label1->Text = ss; // відображення на формі
16. Як визначити довжину рядка типу string? Функція length
Для визначення кількості символів у рядку використовується функція length() без параметрів.
Приклад.
string str = "Hello world!"; int len; // визначити довжину рядка len = str.length(); // len = 12