Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Строки Строковый тип или стандартный класс string

Язык С++ включает в себя стандартный класс, называемый string. Этот класс во многом улучшает традиционный строковый тип char[], поскольку он более эффективен и безопасен в использовании. Например, не нужно заботиться о создании массива нужного размера для содержания строковых переменных. Тип данных string берет на себя всю ответственность за управление памятью. Он позволяет изменять строку динамически в соответствии с потребностями. Основные действия со строками выполняются в нём с помощью операций и методов. Для использования типа string необходимо подключить заголовочный файл <string> или (если vcl.h) <cstring.h>. Строка типа string не имеет и не содержит нуль-символа.

Для объектов типа string разрешены следующие операции: =, +, ==, !=, <, <=, >, >=, [], <<, >>, +=.

Рассмотрим пример:

#include <string>

int main() {

string s1, s2("sotrudnik"), s3;

s1 = "Privet";

cout << "\n Vvedite imya: "; cin >> s3;

s1 = s1+ " " + s2 + " " + s3; // или cout << s1 + " " + s2 + " " + s3;

cout << s1;

getch(); return 0;

}

Данный пример показывает способы инициализации объектов типа string, а так же использование операций присваивания и конкатенации. Ввод и вывод для объектов класса string осуществляется путём, схожим с применяемым для строкового типа. Операции << и >> перегружены для использования с объектами типа string и работают так же как с char. Таким образом, если потребуется считывать строку, имеющую пробелы, то необходимо пользоваться методом getline(). Рассмотрим пример:

int main() {

string fio, address;

cout << "Vvedite FIO: "; getline(cin, fio);

cout << "Vashe FIO: " << fio;

cout << "\nVvedite vash adress v neskolko strok:\n";

getline(cin, address, '$');

cout << "Vash adress: " << address << endl;

getch(); return 0;

}

Метод getline (); позволяет считать полное имя, которое возможно содержит внутренние пробелы. Первым аргументом этого метода является потоковый объект, из которого будет приниматься ввод (cin), а вторым аргументом - объект типа string, куда будет помещён текст. Если функция не имеет третьего аргумента, то предполагается, что завершающим символом строки будет '\n', представляющий клавишу Enter (вернее переход на следующую строку).

Имеются различные методы для поиска строк и фрагментов строк в объектах класса string:

  • find() – для поиска строки, переданной в качестве аргумента, в строке для которой был вызван метод. Если поиск удачен, то возвращает номер позиции, с которой начинается найденная строка, иначе возвращает -1, например:

string s1, s2; //пример 1

s1 = "Privet mir";

s2 = "mir";

int p = s1.find(s2);

cout << p; // строка s2 начинается в строке s1 c 7 позиции

string s1, s2; //пример 2

s1 = "Privet miru";

s2 = "miro";

int p=s1.find(s2, 5); //искать с пятого символа

if(p < 0 ) cout << "s2 v s1 ne naidena";

else cout << p;

  • find_first_of() – для поиска любого символа из группы(переданной в качестве аргумента). Возвращает позицию первого найденного символа, например:

string s1;

s1 = "Privet miru";

int p=s1.find_first_of("abvgde", 0); //поиск серии с нулевой позиции

if(p<0)

cout << "Bukvy a, b, v, g, d, e ne naideny!";

else

cout << p; // выведет 3, так как s1[3]=='v'

  • find_first_not_of() ищет первый символ в строке, который не входит в определённую группу символов и возвращает его позицию;

  • и т.д. ...

Имейте ввиду, что для каждой функции существует вариант, позволяющий исакть в заданной строке подстроки типа char.

Существуют различные способы модификации объектов класса string, с помощью следующих наиболее часто используемых методов:

  • erase(позиция первого символа фрагмента , длина фрагмента) удаляет фрагмент из строки, например:

string s1;

s1 = "Privet mir";

s1.erase(1, 7);

cout << s1; //увидим Pir

  • replace(позиция начала замены , кол-во символов исх. строки, которое должно быть заменено , строка для замены) заменяет часть строки на другую строку, например:

s1 = "Privet mir";

s1.replace(1, 5, "oka");

cout << s1; // увидим Poka mir

  • insert() вставляет строку, определённую во втором аргументе, на место, определённое в первом аргументе, например:

string s1;

s1 = "Privet mir";

s1.insert(6, "ik");

cout << s1; //увидим Privetik mir

  • size() и length() возвращают количество символов в объекте класса string;

  • clear() очищает (обнуляет) строку, например:

s1 = "Privet mir";

s1.clear();

cout << s1.length(); //увидим 0

  • append(кол-во символов, которое будет добавлено в конец , символы, которые будут добавлены) эквивалентна +.

Для сравнения объектов класса string обычно используют перегруженные операции (==, <, …) или следующие методы:

  • compare(начальная позиция , число символов, которые надо сравнить , строка используемая для сравнения , начальная позиция , количество символов) сравнивает символы одной строки с другой строкой;

  • substr(позиция фрагмента , кол-во символов) возвращает фрагмент строки, для которой этот метод был вызван.

Для доступа к символам в объектах класса string можно использовать классическую запись s[i]. Для приведения объекта типа string к строковой переменной типа char имеется функция c_str(), добавляющая в конец строки нуль символ. Рассмотрим пример преобразования из string в char:

string s1;

s1 = "Privet mir";

int N = s1.length();

char* s2 = new char [N];

strncpy(s2, s1.c_str(), N); // или for(int i=0; i<N; i++) s2[i]=s1[i];

cout << s2;

Выделенный жирным шрифтом текст можно заменить одним оператором:

const char *s2 = s1.c_str(); //обязательно const

Кроме рассмотренных нами методов класса string существует множество других, с которыми вы должны ознакомиться самостоятельно.