⚙️ C++

Строки и работа с текстом в C++17: подробное руководство

Строки и работа с текстом в C++

Введение: Зачем нам работать с текстом?

Представь, что ты пишешь программу для социальной сети или музыкального сервиса. Тебе нужно обрабатывать имена пользователей, хештеги, текст песен или статей. В C++ для этого есть специальный тип данных — строка (string). Строки позволяют хранить целые предложения, слова и даже отдельные буквы. В этом разделе мы научимся создавать строки, изменять их, находить части текста и делать с ними много других полезных вещей.

Основной синтаксис

Чтобы работать со строками в C++, нужно подключить библиотеку #include <string>. Строка объявляется так:

#include <iostream>
#include <string>  // библиотека для работы со строками

int main() {
    std::string name = "Привет, мир!";  // создаём строку
    std::cout << name << std::endl;    // выводим её на экран
    return 0;
}

Основные операции со строками:

  • Длина строки: name.length() или name.size() — возвращает количество символов
  • Доступ к символу по индексу: name[0] — первый символ, name[1] — второй и так далее
  • Склеивание (конкатенация): string a = "При"; string b = "вет"; string c = a + b; — получится "Привет"
  • Ввод с клавиатуры: std::getline(std::cin, name) — позволяет вводить строку с пробелами

Пример: Ввод строки и вывод её длины

#include <iostream>
#include <string>

int main() {
    std::string text;
    std::cout << "Введите текст: ";
    std::getline(std::cin, text);  // вводим строку (можно с пробелами)
    
    std::cout << "Длина строки: " << text.length() << std::endl;
    std::cout << "Первый символ: " << text[0] << std::endl;
    return 0;
}

Полезные методы для работы со строками

  • substr(pos, len) — извлекает часть строки, начиная с позиции pos, длиной len символов
  • find(str) — ищет подстроку str в строке, возвращает позицию первого вхождения или std::string::npos, если не найдено
  • erase(pos, len) — удаляет часть строки
  • insert(pos, str) — вставляет строку str в позицию pos

Пример: Поиск и извлечение части строки

#include <iostream>
#include <string>

int main() {
    std::string hashtag = "#ЛучшийДеньДляПрограммирования";
    
    // Найдем позицию символа '#'
    int pos = hashtag.find("#");
    
    // Извлечем все, что после '#'
    std::string tag_without_hash = hashtag.substr(pos + 1);
    
    std::cout << "Хештег без решетки: " << tag_without_hash << std::endl;
    return 0;
}

Разбор типичных задач

Задача 1: NFT — проверка названия токена
Представь, что ты создатель NFT. Название токена не должно быть длиннее 20 символов. Напишем проверку:

#include <iostream>
#include <string>

int main() {
    std::string nft_name;
    std::cout << "Введите название NFT: ";
    std::getline(std::cin, nft_name);
    
    if (nft_name.length() > 20) {
        std::cout << "Слишком длинное название! Нужно короче 20 символов." << std::endl;
    } else {
        std::cout << "Отличное название! Длина: " << nft_name.length() << " символов." << std::endl;
    }
    return 0;
}

Задача 2: Хештег — извлечение части
Дан хештег вида #ЛучшийДеньДляПрограммирования. Нужно взять только первые 10 символов после решетки:

#include <iostream>
#include <string>

int main() {
    std::string full_hashtag = "#ЛучшийДеньДляПрограммирования";
    int hash_pos = full_hashtag.find("#");
    
    // Извлекаем 10 символов после '#'
    std::string short_hashtag = full_hashtag.substr(hash_pos + 1, 10);
    
    std::cout << "Короткий хештег: #" << short_hashtag << std::endl;
    return 0;
}

Задача 3: Песня — подсчёт количества слов
Чтобы посчитать слова, нужно найти количество пробелов и добавить 1:

#include <iostream>
#include <string>

int main() {
    std::string song_text;
    std::cout << "Введите текст песни: ";
    std::getline(std::cin, song_text);
    
    int word_count = 1;  // как минимум одно слово
    for (int i = 0; i < song_text.length(); i++) {
        if (song_text[i] == ' ') {
            word_count++;
        }
    }
    
    std::cout << "Количество слов в песне: " << word_count << std::endl;
    return 0;
}

Частые ошибки новичков

  • Забывают подключить #include <string> — без этого компилятор не поймёт, что такое std::string
  • Путают индексы — первый символ имеет индекс 0, а не 1. Если строка длиной 5, последний символ — [4]
  • Используют cin вместо getline — cin >> text читает только до первого пробела. Для целых строк с пробелами нужно getline(cin, text)
  • Сравнивают строку с символом — например, if (text == 'a') не сработает, нужно if (text == "a")
  • Забывают про npos — если find() не находит подстроку, она возвращает std::string::npos, а не -1

Итоговый пример: Обратное сообщение (переворот строки)

Напишем программу, которая получает строку и выводит её задом наперёд — как в задаче "Обратное сообщение" для блогера:

#include <iostream>
#include <string>

int main() {
    std::string message;
    std::cout << "Введите сообщение: ";
    std::getline(std::cin, message);
    
    std::string reversed_message = "";
    
    // Идём от последнего символа к первому
    for (int i = message.length() - 1; i >= 0; i--) {
        reversed_message += message[i];  // добавляем символ в конец новой строки
    }
    
    std::cout << "Перевёрнутое сообщение: " << reversed_message << std::endl;
    return 0;
}

Теперь ты знаешь основы работы со строками в C++! С помощью этих знаний можно решать множество интересных задач: обрабатывать тексты, создавать шифры, проверять пароли и многое другое. Главное — помнить про индексы (начинаются с 0) и использовать getline для ввода строк с пробелами.