Работа со строками. Класс string. Конструкторы класса. Функции assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Примеры

Работа со строками. Класс string. Конструкторы класса. Функции assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Примеры


Содержание



1. Какое назначение класса string в программах на C++?

Класс string предназначен для работы со строками типа char*, которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char*. Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса.

2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку <string> и пространство имен std.

#include <string>
using namespace std;

3. Каким образом осуществляется объявление переменной типа string? Примеры

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

// тип string
string s1; // переменная с именем s1 типа string
string s2 = "This is a string variable"; // объявление с инициализацией

// использование переменной типа string с оператором присваивания
s1 = s2; // s1 = "This is a string variable"
s2 = "New text";

4. Какие преимущества и недостатки дает использование класса string в сравнении с типом char*?

Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char*. В сравнении с типом char* тип string имеет следующие основные преимущества:

  • возможность обработки строк стандартными операторами C++ (=, +, = =, <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода;
  • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник;
  • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных.

Основным недостатком типа string в сравнении с типом char*, есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время.

5. Какие операторы можно использовать с объектами класса string?

Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.

С объектами класса string можно использовать нижеследующие операторы

  • = – присваивание
  • + – конкатенация (объединение строк)
  • += – присваивание с конкатенацией
  • == – равенство
  • != – неравенство
  • < – меньше
  • <= – меньше или равно
  • > – больше
  • >= – больше или равно
  • [ ] – индексация

Пример, который демонстрирует использование вышеприведенных операторов

// тип string, операции над строками
string s1 = "s-1";
string s2 = "s-2";
string s3;
bool b;

// операция '=' (присваивание строк)
s3 = s1; // s3 = "s-1"

// операция '+' - конкатенация строк
s3 = s3 + s2; // s3 = "s-1s-2"

// операция '+=' - присваивание с конкатенацией
s3 = "s-3";
s3 += "abc"; // s3 = "s-3abc"

// операция '==' - сравнение строк
b = s2==s1; // b = false
b = s2=="s-2"; // b = true

// операция '!=' - сравнение строк (не равно)
s1 = "s1";
s2 = "s2";
b = s1 != s2; // b = true

// операции '<' и '>' - сравнение строк
s1 = "abcd";
s2 = "de";
b = s1 > s2; // b = false
b = s1 < s2; // b = true

// операции '<=' и '>=' - сравнение строк (меньше или равно, больше или равно)
s1 = "abcd";
s2 = "ab";
b = s1 >= s2; // b = true
b = s1 <= s2; // b = false
b = s2 >= "ab"; // b = true

// операция [] - индексация
char c;
s1 = "abcd";
c = s1[2]; // c = 'c'
c = s1[0]; // c = 'a'

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

string();
string(const char * str);
string(const string & str);
7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

string s1("Hello!"); // инициализация - конструктор string(const char * str)
string s2 = "Hello!"; // инициализация - конструктор string(const char * str)
char * ps = "Hello";
string s3(ps); // инициализация
string s4(s3); // инициализация - конструктор string(const string & str)
string s5; // инициализация - конструктор string()

8. Присваивание строк. Функция assign(). Примеры

Чтобы присвоить одну строку другой, можно применить один из двух методов:

  • использовать оператор присваивания ‘=’;
  • использовать функцию assign() из класса string.

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

string &assign(void);

В этом случае происходит простое присваивание одной строки другой.

Второй вариант позволяет копировать заданное количество символов из строки:

string &assign(const string & s, size_type st, size_type num);

где

  • s – объект, из которого берется исходная строка;
  • st – индекс (позиция) в строке, из которой начинается копирование num символов;
  • num – количество символов, которые нужно скопировать из позиции st;
  • size_type – порядковый тип данных.

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s:

string & assign(const char * s, size_type num);

где

  • s – строка, которая завершается символом ‘\0’;
  • num – количество символов, которые копируются в вызывающий объект. Копируются первые num символов из строки s.

Ниже приведен пример с разными реализациями функции assign().

Пример.

// присваивание строк, функция assign()
string s1 = "bestprog.net";
string s2;
string s3;
char * ps = "bestprog.net";

s3 = s1; // s3 = "bestprog.net"
s2.assign(s1); // s2 = "bestprog.net"
s2.assign(s1, 0, 4); // s2 = "best"
s2.assign(ps, 8); // s2 = "bestprog"

9. Объединение строк. Функция append(). Пример

Для объединения строк используется функция append(). Для добавления строк также можно использовать операцию ‘+’, например:

string s1;
string s2;
s1 = "abc";
s2 = "def";
s1 = s1 + s2; // s1 = "abcdef"

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

string &append(const string & s, size_type start);
string &append(const char * s, size_type num);

В первом варианте реализации функция получает ссылку на строчный объект s, который добавляется к вызывающему объекту. Во втором варианте реализации функция получает указатель на строку типа const char *, которая завершается символом ‘\0’.

Пример. Демонстрация работы функции append().

string s1 = "abcdef";
s2 = "1234567890";
append(s2, 3, 4); // s1 = "abcdef4567"

char * ps = "1234567890";
s1 = "abcdef";
s1.append(ps, 3); // s1 = "abcdef123"

10. Вставка символов в строке. Функция insert(). Пример

Чтобы вставить одну строку в заданную позицию другой строки нужно использовать функцию insert(), которая имеет несколько вариантов реализации.

Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

string & insert(size_type start, const string &s);

Второй вариант функции позволяет вставить часть (параметры insStart, num) строки s в заданную позицию start вызывающей строки:

string & insert(size_type start, const string &s, size_type insStart, size_type num);

В вышеприведенных функциях:

  • s – строка, которая вставляется в вызывающую строку;
  • start – позиция в вызывающей строке, из которой осуществляется вставка строки s;
  • insStart – позиция в строке s, из которой происходит вставка;
  • num – количество символов в строке s, которые вставляются с позиции insStart.
string s1 = "abcdef";
string s2 = "1234567890";

s1.insert(3, s2); // s1 = "abc"+"1234567890"+"def"="abc1234567890def"
s2.insert(2, s1, 1, 3); // s2 = "12bcd34567890"

11. Замена символов в строке. Функция replace(). Пример

Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:

string &replace(size_type start, size_type num, const string &s);
string &replace(size_type start, size_type num, const string &s, size_type replStart, size_type replNum);

В первом варианте реализации вызывающая строка заменяется строкой s. Есть возможность задать позицию (start) и количество символов (num) в вызывающей строке, которые нужно заменить строкой s.

Второй вариант функции replace() отличается от первого тем, что позволяет заменять вызывающую строку только частью строки s. В этом случае задаются два дополнительных параметра: позиция replStart и количество символов в строке s, которые образуют подстроку, которая заменяет вызывающую строку.

Пример. Демонстрация работы функции replace().

string s1 = "abcdef";
string s2 = "1234567890";

s2.replace(2, 4, s1); // s2 = "12abcdef7890"
s2 = "1234567890";
s2.replace(3, 2, s1); // s2 = "123abcdef67890"
s2 = "1234567890";
s2.replace(5, 1, s1); // s2 = "12345abcdef7890"

// замена символов, функция replace()
string s1 = "abcdef";
string s2 = "1234567890";

s2.replace(2, 4, s1); // s2 = "12abcdef7890"
s2 = "1234567890";
s2.replace(3, 2, s1); // s2 = "123abcdef67890"

s2 = "1234567890";
s2.replace(5, 1, s1); // s2 = "12345abcdef7890"
s2 = "1234567890";
s2.replace(5, 1, s1, 2, 3); // s2 = "12345cde7890"
s2 = "1234567890";
s2.replace(4, 2, s1, 0, 4); // s2 = "1234abcd7890"

12. Удаление заданного количества символов из строки. Функция erase(). Пример

Для удаления символов из вызывающей строки используется функция erase():

string & erase(size_type index=0, size_type num = npos);

где

  • index – индекс (позиция), начиная из которой нужно удалить символы в вызывающей строке;
  • num – количество символов, которые удаляются.

Пример.

string s = "01234567890";
s.erase(3, 5); // s = "012890"
s = "01234567890";
s.erase(); // s = ""

13. Поиск символа в строке. Функции find() и rfind(). Примеры

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

  • путем просмотра строки от начала до конца с помощью функции find();
  • путем просмотра строки от конца к началу функцией rfind().

Прототип функции find() имеет вид:

size_type find(const string &s, size_type start = 0) const;

где

  • s – подстрока, которая ищется в строке, что вызывает данную функцию. Функция осуществляет поиск первого вхождения строки s. Если подстрока s найдена в строке, что вызвала данную функцию, тогда возвращается позиция первого вхождения. В противном случае возвращается -1;
  • start – позиция, из которой осуществляется поиск.

Прототип функции rfind() имеет вид:

size_type rfind(const string &s, size_type start = npos) const;

где

  • s – подстрока, которая ищется в вызывающей строке. Поиск подстроки в строке осуществляется от конца к началу. Если подстрока s найдена в вызывающей строке, то функция возвращает позицию первого вхождения. В противном случае функция возвращает -1;
  • npos – позиция последнего символа вызывающей строки;
  • start – позиция, из которой осуществляется поиск.

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

// тип string, функция find()
string s1 = "01234567890";
string s2 = "345";
string s3 = "abcd";
int pos;

pos = s1.find(s2); // pos = 3
pos = s1.find(s2, 1); // pos = 3
pos = s1.find("jklmn", 0); // pos = -1
pos = s1.find(s3); // pos = -1
pos = s2.find(s1); // pos = -1

Пример 2. Демонстрация работы функции rfind().

// тип string, функции find() и rfind()
string s1 = "01234567890";
string s2 = "345";
string s3 = "abcd";
string s4 = "abcd---abcd";
int pos;

pos = s1.rfind(s2); // pos = 3
pos = s1.rfind(s2, 12); // pos = 3
pos = s1.rfind(s2, 3); // pos = 3
pos = s1.rfind(s2, 2); // pos = -1
pos = s2.rfind(s1); // pos = -1
pos = s1.rfind(s3, 0); // pos = -1

// разница между функциями find() и rfind()
pos = s4.rfind(s3); // pos = 7
pos = s4.find(s3); // pos = 0

14. Сравнение частей строк. Функция compare(). Пример

Поскольку тип string есть классом, то, чтобы сравнить две строки между собой можно использовать операцию ‘= =’. Если две строки одинаковы, то результат сравнения будет true. В противном случае, результат сравнения будет false.

Но если нужно сравнить часть одной строки с другой, то для этого предусмотрена функция compare().

Прототип функции compare():

int compare(size_type start, size_type num, const string &s) const;

где

  • s – строка, которая сравнивается с вызывающей строкой;
  • start – позиция (индекс) в строке s, из которой начинается просмотр символов строки для сравнения;
  • num – количество символов в строке s, которые сравниваются с вызывающей строкой.

Функция работает следующим образом. Если вызывающая строка меньше строки s, то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s, функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.

Пример. Демонстрация работы функции compare():

// тип string, функция compare()
string s1 = "012345";
string s2 = "0123456789";
int res;

res = s1.compare(s2); // res = -1
res = s1.compare("33333"); // res = -1
res = s1.compare("012345"); // res = 0
res = s1.compare("345"); // res = -1
res = s1.compare(0, 5, s2); // res = -1
res = s2.compare(0, 5, s1); // res = -1
res = s1.compare(0, 5, "012345"); // res = -1
res = s2.compare(s1); // res = 1
res = s2.compare("456"); // res = -1
res = s2.compare("000000"); // res = 1

15. Получение строки с символом конца строки ‘\0’ (char *). Функция c_str(). Пример

Чтобы получить строку, которая заканчивается символом ‘\0’ используется функция c_str().

Прототип функции:

const char * c_str() const;

Функция объявлена с модификатором const. Это означает, что функция не может изменять вызывающий объект (строку).

Пример 1. Преобразование типа string в const char *.

// тип string, функция c_str()
string s = "abcdef";
const char * ps;
ps = s.c_str(); // ps = "abcdef"

Пример 2.

Ниже продемонстрирован перевод строки из string в тип System::String для отображения его в элементе управления типа Label для приложений типа Windows Forms Application.

// тип string, функция c_str()
string s = "abcdef";
String ss;
ss = gcnew String(s.c_str()); // конвертирование
label1->Text = ss; // отображение на форме


Связанные темы