Методичка з C++ - Рядки. Тип string

Примітка: Клас string надає зручний спосіб роботи з рядками в C++.

1. Вступ до класу string

Клас string є частиною стандартної бібліотеки C++ та надає розширені можливості для роботи з рядками порівняно з масивами char.

#include <iostream>
#include <string> // необхідний заголовок
using namespace std;

int main() {
    // Різні способи створення рядків
    string str1; // порожній рядок
    string str2 = "Привіт"; // ініціалізація
    string str3("Світ"); // конструктор
    string str4(5, 'A'); // "AAAAA"
    string str5 = str2 + " " + str3; // конкатенація
    
    cout << "str1: '" << str1 << "'" << endl;
    cout << "str2: " << str2 << endl;
    cout << "str4: " << str4 << endl;
    cout << "str5: " << str5 << endl;
    
    return 0;
}
 

2. Основні операції з рядками

2.1. Введення та виведення

#include <iostream>
#include <string>

int main() {
    string name, city;
    
    cout << "Введіть ваше ім'я: ";
    cin >> name; // зчитує до першого пробілу
    
    cout << "Введіть місто: ";
    cin.ignore(); // ігноруємо попередній символ нового рядка
    getline(cin, city); // зчитує весь рядок
    
    cout << "Ім'я: " << name << endl;
    cout << "Місто: " << city << endl;
    
    // Зчитування з пробілами
    string fullName;
    cout << "Введіть повне ім'я: ";
    cin.ignore();
    getline(cin, fullName);
    cout << "Повне ім'я: " << fullName << endl;
    
    return 0;
}
    

2.2. Операції порівняння

#include <iostream>
#include <string>

int main() {
    string str1 = "apple";
    string str2 = "banana";
    string str3 = "Apple";
    
    // Порівняння
    cout << boolalpha; // вивід true/false замість 1/0
    cout << "str1 == str2: " << (str1 == str2) << endl;
    cout << "str1 != str2: " << (str1 != str2) << endl;
    cout << "str1 < str2: " << (str1 < str2) << endl;
    cout << "str1 == str3: " << (str1 == str3) << endl;
    
    // Порівняння з урахуванням регістру
    string lowerStr1 = str1;
    string lowerStr3 = str3;
    // Тут можна використати transform для приведення до нижнього регістру
    
    return 0;
}
  

3. Основні методи класу string

Метод Опис Приклад
length(), size() Повертає довжину рядка str.length()
empty() Перевіряє, чи рядок порожній str.empty()
clear() Очищає рядок str.clear()
append() Додає рядок в кінець str.append("text")
find() Пошук підрядка str.find("abc")
substr() Повертає підрядок str.substr(2, 5)
replace() Замінює частину рядка str.replace(0, 3, "new")
insert() Вставляє рядок str.insert(3, "ins")
erase() Видаляє частину рядка str.erase(2, 4)

3.1. Практичне використання методів

#include <iostream>
#include <string>

int main() {
    string text = "Програмування на C++ - це цікаво!";
    
    // Основні методи
    cout << "Довжина: " << text.length() << endl;
    cout << "Порожній?: " << text.empty() << endl;
    
    // Пошук
    size_t pos = text.find("C++");
    if (pos != string::npos) {
        cout << "'C++' знайдено на позиції: " << pos << endl;
    }
    
    // Підрядок
    string substring = text.substr(0, 12);
    cout << "Підрядок: " << substring << endl;
    
    // Заміна
    text.replace(text.find("цікаво"), 6, "захопливо");
    cout << "Після заміни: " << text << endl;
    
    // Додавання
    text.append(" Дізнайтесь більше!");
    cout << "Після додавання: " << text << endl;
    
    return 0;
}
    

4. Робота з українським текстом

#include <iostream>
#include <string>
#include <locale>
#include <algorithm>

int main() {
    // Встановлення української локалі
    setlocale(LC_ALL, "uk_UA.UTF-8");
    
    string ukrainianText = "Українська мова має багато специфічних літер: ґ, є, і, ї";
    
    cout << "Текст: " << ukrainianText << endl;
    cout << "Довжина рядка: " << ukrainianText.length() << " символів" << endl;
    cout << "Розмір у байтах: " << ukrainianText.size() << endl;
    
    // Пошук українських літер
    string specificLetters = "ґєії";
    for (char c : specificLetters) {
        size_t found = ukrainianText.find(c);
        if (found != string::npos) {
            cout << "Літера '" << c << "' знайдена на позиції " << found << endl;
        }
    }
    
    // Підрахунок кількості слів
    int wordCount = 0;
    bool inWord = false;
    
    for (char c : ukrainianText) {
        if (c == ' ' || c == ',' || c == ':' || c == '.') {
            if (inWord) {
                wordCount++;
                inWord = false;
            }
        } else {
            inWord = true;
        }
    }
    if (inWord) wordCount++; // останнє слово
    
    cout << "Кількість слів: " << wordCount << endl;
    
    return 0;
}
    

5. Ітерація по рядку

#include <iostream>
#include <string>

int main() {
    string text = "Hello World";
    
    // Способи ітерації по рядку
    cout << "1. Звичайний for:" << endl;
    for (int i = 0; i < text.length(); i++) {
        cout << "'" << text[i] << "' ";
    }
    cout << endl;
    
    cout << "2. Range-based for:" << endl;
    for (char c : text) {
        cout << "'" << c << "' ";
    }
    cout << endl;
    
    cout << "3. З використанням ітераторів:" << endl;
    for (string::iterator it = text.begin(); it != text.end(); it++) {
        cout << "'" << *it << "' ";
    }
    cout << endl;
    
    // Модифікація рядка через ітератори
    for (string::iterator it = text.begin(); it != text.end(); it++) {
        *it = toupper(*it); // перетворення у верхній регістр
    }
    cout << "У верхньому регістрі: " << text << endl;
    
    return 0;
}
    

6. Робота з stringstream

#include <iostream>
#include <string>
#include <sstream>

int main() {
    // Розбір рядка на складові
    string data = "Іван 25 85.5 Студент";
    stringstream ss(data);
    
    string name;
    int age;
    double score;
    string status;
    
    ss >> name >> age >> score >> status;
    
    cout << "Ім'я: " << name << endl;
    cout << "Вік: " << age << endl;
    cout << "Бал: " << score << endl;
    cout << "Статус: " << status << endl;
    
    // Формування рядка
    stringstream output;
    output << "Ім'я: " << name << ", Вік: " << age << ", Бал: " << score;
    cout << "Сформований рядок: " << output.str() << endl;
    
    // Конвертація числа в рядок
    int number = 12345;
    stringstream converter;
    converter << number;
    string numberStr = converter.str();
    cout << "Число як рядок: '" << numberStr << "'" << endl;
    
    return 0;
}
    

7. Вправи для самостійної роботи

Вправа 1: Обернення рядка

Написати функцію, яка приймає рядок і повертає його у зворотному порядку.

Вправа 2: Підрахунок голосних

Створити програму, яка підраховує кількість голосних літер у українському тексті.

Вправа 3: Форматування тексту

Написати функцію, яка форматує текст: першу літеру кожного речення робить великою.

Вправа 4: Пошук найдовшого слова

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

Корисні поради: