Мы можем работать со строками в С++ в так называемом С-стиле как с массивами символов, которые оканчиваются на нулевой байт '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