Шаг 548.
Библиотека STL. Интернационализация. Классификация и преобразования символов. Глобальные вспомогательные функции классификации символов

    На этом шаге мы рассмотрим функции, используемые для классификации символов.

    Для удобства работы с фацетом ctype определен ряд глобальных функций, перечисленных в таблице 1.

Таблица 1. Глобальные вспомогательные функции классификации символов
Функция Описание
isalnum(c, loc) Проверяет, является ли с буквой или цифрой (эквивалент isalpha()&&isdigit())
isalpha(c, loc) Проверяет, является ли с буквой
iscntrl(c, loc) Проверяет, является ли с управляющим символом
isdigit(c, loc) Проверяет, является ли с цифрой
isgraph(c, loc) Проверяет, является ли с печатным символом, исключая пробелы (эквивалент isalnum()&&ispunct())
islower(c, loc) Проверяет, является ли с буквой нижнего регистра
isprint(c, loc) Проверяет, является ли с печатным символом (включая пропуски)
ispunct(c, loc) Проверяет, является ли с знаком препинания (то есть печатным символом, отличным от пробела, цифры или буквы)
isspace(c, loc) Проверяет, является ли с пробелом
isupper(c, loc) Проверяет, является ли с буквой верхнего регистра
isxdigit(c, loc) Проверяет, является ли с шестнадцатеричной цифрой
tolower(c, loc) Преобразует с из верхнего регистра в нижний
toupper(c, loc) Преобразует с из нижнего регистра в верхний

    Например, следующее выражение проверяет, является ли символ с буквой нижнего регистра в локальном контексте loc:

  std::islower(c,loc)

    Функция возвращает значение типа bool.

    Следующее выражение возвращает символ с, преобразованный в букву верхнего регистра в локальном контексте loc:

  std::toupper(c,loc)

    Если с не является буквой нижнего регистра, функция возвращает первый аргумент без изменений.

    Представленный ниже вызов и следующая за ним конструкция эквивалентны:

std::islower(c,loc)
std::use_facet<std::ctype<char> >(loc).is(std::ctype_base::lower,c)

    В приведенном выражении вызывается функция is() фацета ctype<char>. Функция is() проверяет, относится ли символ с к какой-либо из категорий, определяемых маской (первый аргумент). Значения флагов маски определяются в классе ctype_base. Примеры использования вспомогательных функций приведены на 385 и 517 шагах.

    Глобальные вспомогательные функции классификации символов соответствуют одноименным функциям С, получающим только один аргумент. Эти функции определяются в заголовочных файлах <cctype> и <ctype.h> и всегда используют текущий единый локальный контекст С. Работать с ними еще удобнее:

  if (std::isdigit(С)) {
    .   .   .   .
  }

    Тем не менее при использовании этих функций вы не сможете работать с разными локальными контекстами в одной программе, а также задействовать функции С с пользовательским фацетом ctype. Пример применения функций С для преобразования всех символов строки к верхнему регистру приведен на 382 шаге.

    Вспомогательные функции C++ не должны использоваться в тех фрагментах кода, которые критичны по быстродействию. Гораздо быстрее получить соответствующий фацет от локального контекста и работать с функциями этого объекта напрямую. Если требуется классифицировать большое количество символов в одном локальном контексте, имеется еще более эффективное решение (во всяком случае, для символов, не относящихся к типу char). Для классификации типичных символов можно воспользоваться функцией is(beg, end, vec): эта функция строит для каждого символа из интервала [beg,end) маску с описанием свойств этого символа. Полученная маска сохраняется в элементе вектора vec, позиция которого соответствует позиции символа. Далее полученный вектор используется для быстрой идентификации символов.

    На следующем шаге мы рассмотрим преобразование кодировок.




Предыдущий шаг Содержание Следующий шаг