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