Строки и работа с текстом в 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 для ввода строк с пробелами.