Робота з рядками. Клас string. Конструктори класу. Функції assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Приклади

Робота з рядками. Клас string. Конструктори класу. Функції assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Приклади


Зміст



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


Зв’язані теми