Int main() {
string first_name, last_name;
cout << "Enter your first and last name:\n";
cin >> first_name >> last_name;
cout << "Your last name is spelled:\n";
int i;
for (i =0; i < last_name.length(); i++)
{
cout << last_name[i] << " ";
last_name[i] = '-';
}
cout « endl;
for (i =0; i < last_name.length(); i++)
cout << last_name[i] << " ";
// Выводит "-" под каждой буквой. cout « endl;
cout << "Good day " << fi rst_name << endl;
return 0; }
Пример диалога
Enter your first and last name:
John Crichton
Your last name is spelled:
C r i c h t o n
- - - - - - - -
Good day John
Когда для объекта типа string задается индекс в квадратных скобках, этот объект не проверяет допустимость заданного индекса. И если индекс оказывается недопустимым (то есть большим или равным длине строки, хранящейся в объекте), последствия непредсказуемы — программа может выполнить ошибочные действия, не выводя сообщения об ошибке.
Однако у объектов string имеется функция-член at, проверяющая заданный индекс. Она выполняет ту же задачу, что и квадратные скобки, но отличается от них, во-первых, синтаксисом (вместо вызова a[i] используется вызов а.at(i)), а во-вторых, тем, что она проверяет, допустим ли индекс, переданный ей в качестве аргумента. И если значение i в вызове a.at(i) оказывается недопустимым, функция выводит сообщение с указанием ошибки, содержащейся в программе. В следующих двух фрагментах кода выполняются попытки доступа к символам за пределами строки, первая из этих попыток проходит незамеченной (то есть без сообщения об ошибке):
string str="Mary";
cout « str[6] « endl:
а вторая:
string str ="Mary";
cout « str.at(6) « endl;
вызывает немедленное завершение программы с указанием ошибки. Но учтите, что в некоторых системах сообщения об этой ошибке довольно невразумительные.
Объект типа string позволяет изменить один символ строки путем присвоения значения типа char индексированной переменной, такой как str[i]. To же самое можно сделать и с помощью функции-члена at. Например, для замены третьего символа объекта str типа string символом 'X' можно выполнить один из двух операторов:
str.at(2)='X';
или
str[2]='X';
Как и в обычном символьном массиве, позиции символов в объекте string нумеруются с нуля, поэтому третий символ строки имеет индекс 2.
Список часто используемых функций-членов класса stri ng приведен в табл. 15.1.
Многие операции с объектами этого класса производить удобнее, чем со строками С, описанными в лекции 14. В частности, оператор ==, выполняемый над объектами класса string, возвращает результат, который соответствует нашему традиционному пониманию равенства строк — то есть значение true, если две строки содержат одинаковые символы в одинаковом порядке, и значение false в противном случае. Операторы сравнения <, >, <=, >= сравнивают строки с точки зрения их лексикографического порядка. (Лексикографический (словарный) порядок — это обычный алфавитный порядок сортировки на основе набора символов ASCII. Если строки состоят лишь из букв, причем либо только строчных, либо только прописных, лексикографический порядок полностью совпадает с обычным алфавитным порядком сортировки.)
Операторы сравнения для объектов типа string
При использовании со стандартным типом string языка C++ операторы ==, !=, <, >, <=, >= соответствуют нашему традиционному представлению о сравнении строк. Эти операторы ведут себя не так, как со строками С.
Таблица 15.1. Функции-члены стандартного класса string
ПРИМЕР |
ПРИМЕЧАНИЕ |
Конструкторы string строка;
string строка("образец"); string строка(строковая_переменная);
Доступ к элементам cтрока[i]
строка. at(i)
строка.substr(позиция, длина) Присваивание/модификация cтрока1 = строка2;
строка1 += строка2;
строка.empty();
строка1 + строка2;
строка.insert(позиция, строка1);
строка.remove(позиция, длина); Сравнение строка1 == строка2 строка1 != строка2 строка 1 <= строка2 строка1 >= строка2 Поиск строка. find(строка1)
строка. find (строка1, позиция)
строка . find_first_of(строка1, позиция)
строка. find_fi rst_not_of(строка1, позиция)
|
Используемый по умолчанию конструктор создает пустой объект строка типа string Создает объект типа string с данными "образец" Создает объект типа string с именем строка, представляющий собой копию объекта строковая _переменная (строковая_переменная — объект класса string) Возвращает ссылку на символ строки строка с индексом i для чтения-записи. Не проверяет допустимость индекса Возвращает ссылку на символ строки с индексом i для чтения-записи. Проверяет допустимость индекса, а в остальном эквивалентна выражению cтрока[i] Возвращает подстроку из вызывающего объекта, начиная с индекса позиция, длиной длина символов Инициализирует объект строка1 данными объекта строка2 Добавляет строку объекта строка2 в конец строки объекта строка 1 Возвращает true, если строка содержит пустую строку, и false в противном случае Возвращает строку, представляющую собой конкатенацию строк строка1 и строка2 Вставляет строку строка2 в строку строка, начиная с позиции позиция Удаляет подстроку длиной длина, начиная с позиции позиция Сравнение на равенство и на неравенство. Возвращает значение типа bool Четыре сравнения. Выполняются на основе лексикографического порядка
Возвращает индекс первого вхождения строка1 в строку строка Возвращает индекс первого вхождения строка 1 в строку строка; поиск начинается с позиции позиция Возвращает индекс первого вхождения в строку строка любого символа строки строка 1; поиск начинается с позиции позиция Возвращает индекс первого вхождения в строку строка любого символа, отсутствующего в строке строка!; поиск начинается с позиции позиция |
Пример: проверка палиндрома
Палиндром - это строка, одинаково читающаяся слева направо и справа налево. Программа, приведенная в листинге 15.4, проверяет входную строку, чтобы узнать, является ли она палиндромом. Эта программа игнорирует пробелы и знаки
препинания и считает прописную и строчную версии буквы одним и тем же символом. Вот несколько примеров палиндромов:
Able was I ere I saw Elba.
I Love Me. Vol. I.
Madam. I'm Adam.
A man, a plan, a canal. Panama.
Rats live on no evil star.
radar
deed
mom
racecar
Функция remove_punct интересна тем, что в ней используются функции-члены substr и find объекта string. Функция-член substr извлекает из вызывающего объекта подстроку заданной длины, начиная с указанной позиции. В трех первых строках функции remove_punct объявляются необходимые переменные. Затем выполняется цикл for, в котором перебираются все символы параметра s и производится поиск каждого из них в строке punct. Поиск выполняется посредством функции-члена find. Если искомый символ не будет найден в строке punct, он добавляется в конец результирующей строки no_punct.
Листинг 15.4. Программа для проверки палиндрома
// Проверяет, является ли введенная строка палиндромом.
#include <iostream>
#include <string>
#include <cctype>
using namespace std: