×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 74 из 714 Настройки

А теперь пересмотрим предыдущую программу так, чтобы она выводила только непустые строки:

>// читать ввод построчно и отбрасывать пустые строки

>while (getline(cin, line))

> if (!line.empty())

>  cout << line << endl;

Условие использует оператор логического NOT (оператор>!). Он возвращает инверсное значение своего операнда типа >bool. В данном случае условие истинно, если строка >line не пуста.

Функция >size() возвращает длину строки (т.е. количество символов в ней). Давайте используем ее для вывода строк длиной только больше 80 символов.

>string line;

>// читать ввод построчно и отображать строки длиной более 80 символов

>while (getline(cin, line))

> if (line.size() > 80)

>  cout << line << endl;

Тип >string::size_type

Вполне логично ожидать, что функция >size() возвращает значение типа >int, а учитывая сказанное в разделе 2.1.1, вероятней всего, типа >unsigned. Но вместо этого функция >size() возвращает значение типа >string::size_type. Этот тип требует более подробных объяснений.

В классе >string (и нескольких других библиотечных типах) определены вспомогательные типы данных. Эти вспомогательные типы позволяют использовать библиотечные типы машинно-независимым способом. Тип >size_type — это один из таких вспомогательных типов. Чтобы воспользоваться типом >size_type, определенным в классе >string, применяется оператор области видимости (оператор >::), указывающий на то, что имя >size_type определено в классе >string.

Хотя точный размер типа >string::size_type неизвестен, можно с уверенностью сказать, что этот беззнаковый тип (см. раздел 2.1.1) достаточно большой, чтобы содержать размер любой строки. Любая переменная, используемая для хранения результата операции >size() класса >string, должна иметь тип >string::size_type.

По общему признанию, довольно утомительно вводить каждый раз тип >string::size_type. По новому стандарту можно попросить компилятор самостоятельно применить соответствующий тип при помощи спецификаторов >auto или >decltype (см. раздел 2.5.2):

>auto len = line.size(); // len имеет тип string::size_type

Поскольку функция >size() возвращает беззнаковый тип, следует напомнить, что выражения, в которых смешаны знаковые и беззнаковые данные, могут дать непредвиденные результаты (см. раздел 2.1.2). Например, если переменная >n типа >int содержит отрицательное значение, то выражение s>.size() < n почти наверняка истинно. Оно возвращает значение >true потому, что отрицательное значение переменной >n преобразуется в большое беззнаковое значение.

Проблем преобразования между беззнаковыми и знаковыми типами можно избежать, если не использовать переменные типа >int в выражениях, где используется функция >size().

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

Класс >string определяет несколько операторов для сравнения строк. Эти операторы сравнивают строки посимвольно. Результат сравнения зависит от регистра символов, символы в верхнем и нижнем регистре отличаются.

Операторы равенства (>== и >!=) проверяют, равны или не равны две строки соответственно. Две строки равны, если у них одинаковая длина и одинаковые символы. Операторы сравнения (