Как уже было рассмотрено в статье Введение в строки, в языке C++ для работы со строками определен специальный тип std::string, определенный в модуле <string>
. Рассмотрим подробнее основные моменты работы с данным типом.
Объект типа string содержит последовательность символов типа char, которая может быть пустой. Например, определение пустой строки:
std::string message;
Также можно инициализировать или присвоить переменной string конкретную строку:
std::string message {"Hello METANIT.COM!"}; // или так std::string message2 = "Hello METANIT.COM!"; std::string message3("Hello METANIT.COM!");
В данном случае переменная message получит копию строкового литерала "Hello METANIT.COM!". В своем внутреннем представлении переменная message будет хранить массив символов, который также заканчивается на нулевой байт. Однако реализация типа string и предлагаемые им возможности делают работу с этим типом более безопасной.
Есть ряд других способов инициализации. Так, можно инициализировать строку повторяющимся набором символов:
std::string message (4, 'd'); // повторяем d 4 раза - message = dddd
И можно инициализировать объект string дргим объектом string:
std::string hello{"hello world"}; std::string message {hello}; // message = "hello world" // или так // std::string message (hello); // std::string message = hello;
Можно инициализировать только часть строки
std::string message1 {"hello world", 4}; // берем первые 4 символа - message1 = hell std::string message2 {"hello world", 6, 5}; // 5 символов начиная с 6 символа - message2 = world std::string hello{"hello world"}; std::string message3 {hello, 4}; // message3 = hell std::string message4 {hello, 6, 5}; // message4 = world
Мы можем вывести подобную строку на консоль:
#include <iostream> #include <string> int main() { std::string message {"Hello METANIT.COM!"}; std::cout << "Message: " << message << std::endl; // Message: Hello METANIT.COM! }
С помощью стандартных потоков ввода и вывода cin
и cout
можно ввести данные в строку и вывести на консоль:
#include <iostream> #include <string> int main() { std::string name; std::cout << "Input your name: "; std::cin >> name; std::cout << "Your name: " << name << std::endl; }
Консольный вывод:
Input your name: Tom Your name: Tom
Чтобы считать всю строку вне зависимости от наличия пробелов, можно применять метод getline():
#include <iostream> #include <string> int main() { std::string name; std::cout << "Input your name: "; getline(std::cin, name); std::cout << "Your name: " << name << std::endl; }
Метод getline принимает два объекта - std::cin
и переменную, в которую надо считать строку.
Консольный вывод:
Input your name: Tom Smith Your name: Tom Smith
С помощью методов length() и size() можно узнать размер строки, то есть из скольких символов она состоит (нулевой байт при этом не учитывается):
#include <iostream> #include <string> int main() { std::string message {"Hello"}; std::cout << "Length: " << message.length() << std::endl; // Length: 5 std::cout << "Size: " << message.size() << std::endl; // Size: 5 }
Если строка пустая, то она содержит 0 символов. В этом случае мы можем применить метод empty() - он возвращает true, если строка пустая:
#include <iostream> #include <string> int main() { std::string message; if(message.empty()) std::cout << "string is empty " << std::endl; else std::cout << "string is not empty" << std::endl; }
Для объединения строк применяется операция сложения:
#include <iostream> #include <string> int main() { std::string hello {"hello"}; std::string world {"world"}; std::string message{ hello + " " + world}; std::cout << message << std::endl; // hello world }
Стоит отметить, что при операции сложения оба операнда НЕ должны одновременно представлять строковые литералы. Например, в следующем случае мы получим ошибку
std::string message{ "hello " + "world" + "!"}; // ! Ошибка
Если вдруг все таки необходимо объединить два строковых литерала, то можно просто опустить операцию сложения
std::string hello {"hello"}; std::string message{ hello + " world" "!"}; // hello world!
В качестве альтернативы можно неявно преобразовать строковый литерал в объект string
. Для этого импортируется пространство имен std::string_literals
и к строковым литералам добавляется суффикс s
#include <iostream> #include <string> using namespace std::string_literals; int main() { std::string message{ "hello "s + "world"s + "!"s}; std::cout << message << std::endl; // hello metanit.com }
В данном случае строки в суффиксом s, например, "hello "s
, будут представлять объекты string.
В строках можно использовать различные специальные символы, которые имеют специальное назначение, например, символ "\t" представляет табуляцию, а "\n" - перевод текста на новую строчку. Но поскольку слеш \ применяется для индикации подобных последовательностей, то чтобы вывести в строке один слеш нам надо предварять его другим слешем: "\\". Кроме того, если мы захотим вывести двойную кавычку внутри строки, то ее тоже надо предварять слешем - "\"". Например:
#include <iostream> #include <string> int main() { std::string text {"Name: \t\"Tom\"\nAge:\t38"}; std::cout << text << std::endl; }
В данном случае консольный вывод будет выглядеть следующим образом:
Name: "Tom" Age: 38
raw-литералы позволяют упростить определение подобных строк. Такие литералы предваряются префиксом R, а сам текст заключается в двойные кавычки и круглые скобки:
#include <iostream> #include <string> int main() { std::string text {R"(Name: "Tom" Age: 38)"}; std::cout << text << std::endl; }
Здесь все отступы табуляции, переводы на новую строку, кавычки внутри строки будут интерпретироваться так, как они определены в строке. В итоге результат будет аналогичен предыдущему.