Введение в строки

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

Мы можем работать со строками в С++ в так называемом С-стиле как с массивами символов, которые оканчиваются на нулевой байт '0'. Однако, что если такой символ не будет найден или в процессе манипуляций со строкой будет удален, то дальшейшие действия с такой строкой могут иметь недетерминированный результат. По этой причине строки в С-стиле считаются небезопасными, и рекомендуется для хранения строк в 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 и предлагаемые им возможности делают работу с этим типом более безопасной.

И можно инициализировать объект string другим объектом string:

std::string hello{"hello world"};
std::string message {hello}; // message = "hello world"
// или так
// std::string message (hello);
// std::string message = hello;

Мы можем вывести подобную строку на консоль:

#include <iostream>
#include <string>

int main()
{
    std::string message {"Hello METANIT.COM!"};
    std::cout << "Message: " << message << std::endl;	// Message: Hello METANIT.COM!
}

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

Подобно массиву мы можем обращаться с помощью индексов к отдельным символам строки, получать и изменять их:

std::string hello {"Hello"};
char c {hello[1]};		// e
hello[0]='M';
std::cout << hello << std::endl;	// Mello

Поскольку объект string представляет последовательность символов, то эту последовательность можно перебрать с помощью цикла for. Например, подсчитаем, сколько раз в строке встречается буква "l":

#include <iostream>
#include <string>

int main()
{
    unsigned count{};	// счетчик, сколько раз встречается символ
    std::string message{ "Hello World"};
    for(const char c: message)
    {
        if(c == 'l')
        {
            count++;
        }
    }
    std::cout << "Count: " << count << std::endl;   // Count: 3
}

Чтение строки с консоли

Для считывания введенной строки с консоли, как и для считывания других значений, можно использовать объект std::cin:

#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

Однако если при данном способе ввода строка будет содержать подстроки, разделенные пробелом, то std::cin будет использовать только первую подстроку:

Input your name: Tom Smith
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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850