Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek12.doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
124.42 Кб
Скачать

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:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]