Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры печатать.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
379.36 Кб
Скачать

25. Стандартный класс string. Конструкторы строк. Изменение величины строки и ее емкости. Присваивание, добавление и обмен строк. Доступ к символам строки.

Набор операций, которыми должен обладать класс string:

  • инициализация массивом символов (строкой встроенного типа) или другим объектом типа string. Встроенный тип не обладает второй возможностью;

  • копирование одной строки в другую. Для встроенного типа приходится использовать функцию strcpy();

  • доступ к отдельным символам строки для чтения и записи. Во встроенном массиве для этого применяется операция взятия индекса или косвенная адресация;

  • сравнение двух строк на равенство. Для встроенного типа используется функция strcmp();

  • конкатенация двух строк, получая результат либо как третью строку, либо вместо одной из исходных. Для встроенного типа применяется функция strcat(), однако чтобы получить результат в новой строке, необходимо последовательно задействовать функции strcpy() и strcat();

  • вычисление длины строки. Узнать длину строки встроенного типа можно с помощью функции strlen();

  • возможность узнать, пуста ли строка. У встроенных строк для этой цели приходится проверять два условия:

char str = 0;

//...

if ( ! str || ! *str )

return;

26. Стандартный класс string. Копирование строк и подстроки. Сравнение строк. Операции поиска.

C++ не поддерживает встроенный строковый тип. Однако он предоставляет два способа обработки строк. Во-первых, для представления строк можно использовать традиционный символьный массив с завершающим нулем. Во-вторых, можно использовать объекты класса string. Существует три причины для включения в C++ стандартного класса string: 1) непротиворечивость данных (строка определяется самостоятельным типом данных), 2)удобство (программист может использовать стандартные С++ операторы) и 3)безопасность (границы массивов отныне не будут нарушаться).

Для использования строковых классов C++ необходимо включить в программу заголовок <string>.

Пример копирования строк и подстроки

// string::copy

#include <iostream>

#include <string>

using namespace std;

int main ()

{

size_t length;

char buffer[20];

string str ("Test string...");

length=str.copy(buffer,6,5);

buffer[length]='\0';

cout << "buffer contains: " << buffer << "\n";

return 0;

}

Пример сравнения строк

// comparing apples with apples

#include <iostream>

#include <string>

using namespace std;

int main ()

{

string str1 ("green apple");

string str2 ("red apple");

if (str1.compare(str2) != 0)

cout << str1 << " is not " << str2 << "\n";

if (str1.compare(6,5,"apple") == 0)

cout << "still, " << str1 << " is an apple\n";

if (str2.compare(str2.size()-5,5,"apple") == 0)

cout << "and " << str2 << " is also an apple\n";

if (str1.compare(6,5,str2,4,5) == 0)

cout << "therefore, both are apples\n";

return 0;

}

Пример поиска

// string::find

#include <iostream>

#include <string>

using namespace std;

int main ()

{

string str ("There are two needles in this haystack with needles.");

string str2 ("needle");

size_t found;

// different member versions of find in the same order as above:

found=str.find(str2);

if (found!=string::npos)

cout << "first 'needle' found at: " << int(found) << endl;

found=str.find("needles are small",found+1,6);

if (found!=string::npos)

cout << "second 'needle' found at: " << int(found) << endl;

found=str.find("haystack");

if (found!=string::npos)

cout << "'haystack' also found at: " << int(found) << endl;

found=str.find('.');

if (found!=string::npos)

cout << "Period found at: " << int(found) << endl;

// let's replace the first needle:

str.replace(str.find(str2),str2.length(),"preposition");

cout << str << endl;

return 0;

}