Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 19

intindex2 = s.find_first_of(", !"); // поиск первого пробела, знака

// восклицания или запятой

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

Сравнение строк

Сравнение строк принципиально отличается от сравнения чисел. Для сравнения двух строк требуются лексические сравнения. Иначе говоря, когда вы проверяете символ и определяете, "больше" или "меньше" он, чем другой, вы в действительности сравниваете числовые представления этих символов в выбранной кодироовке. Чаще всего используется кодировка ASCII, в которой печатные символы английского языка представляются десятичными числами в интервале от 32 до 127, причем буквы в начале алфавита имеют меньшие ASCII-коды, чем буквы в конце алфавита. Это относится и к буквам русского алфавита.

В С++ предусмотрено несколько способов сравнения строк, каждый из которых обладает своими достоинствами и недостатками. Проще всего использовать перегруженные внешние (т. е. не класса string) операторы operator==, operator!=, operator>, operator<, operator>= и operator<=.

Пример 6

strings2("Что"), s1("Это");

// В левой части находится литерал в кавычках, в правой части –

// объект string

if("Что" == s2)

cout << "Есть совпадение" << endl;

// В левой части находится объект string, а в правой – указатель на

// строку в стиле C, завершенную нуль-терминатором.

if(s1 != s2.c_str())

cout << "Нет совпадения" << endl;

Результат

Есть совпадение.

Нет совпадения.

Анализ

Для повышения эффективности в классе string определены пере-груженные операторы для прямых сравнений строковых объектов, литералов в кавычках и указателей на строки  С;

Функция c_strвозвращает const char* – указатель на строку С, завершенную нуль-символом, которая эквивалентна текущему содер-жимому объекта string! Другими словами преобразует строку sting в С-строку. Это позволяет для объектов string использовать стандартные функции С, например функцию atoi или любую функцию, опреде-ленную в заголовочных файлах <string.h>, <stdlib.h> или ctype.h(см. пример 8).

Функция compareкласса string позволяет выполнять гораздо более изощренные и точные сравнения, чем набор внешних операторов. Она существует в нескольких перегруженных версиях для сравнения:

двух полных строк;

части одной строки с полной строкой;

подмножеств двух строк.

Пример 7

string s(“abcd");
s.compare("abcd")       // Возвращает 0
s.compare("dcba")           // Возвращает значение <0 (s меньше)
s.compare("ab")             // Возвращает значение >0 (s больше)
 
s.compare(s)                  // Возвращает 0 (s равно s)
s.compare(0,2,s,2,2)      // Возвращает значение <0 ("ab" меньше "cd")
s.compare(1,2,"bcx",2) // Возвращает 0 ("bc" равно "bc")

При обращении к отдельным символам строк обычно используется синтаксис индексирования ([]) в стиле массивов С. Строки С++ так же поддреживают другой вариант: функцию at. Если все проходит нормально, эти два механизма индексации приводят к одинаковым результатам:

string s(“abcd");
cout<<s[1];      // Выводит b
cout<<s.at(1); // Выводит b
И все же между оператором[] и функций at существует одно важное различие. При попытке обратиться к элементу по индексу, выходящему за границы массива, функция at выдает исключение, тогда как обычный синтаксис [] приводит к непредсказуемым последствиям.

В табл. 1 приведены наиболее распространенные  функции для работы со строками.

Таблица 1

Функции работы со строками