Строки

Определение строк

Последнее обновление: 02.03.2023

Как уже было рассмотрено в статье Введение в строки, в языке 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.

raw-литералы

В строках можно использовать различные специальные символы, которые имеют специальное назначение, например, символ "\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;
}

Здесь все отступы табуляции, переводы на новую строку, кавычки внутри строки будут интерпретироваться так, как они определены в строке. В итоге результат будет аналогичен предыдущему.

Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850