На этом шаге мы рассмотрим функции, используемые для классификации символов.
Для удобства работы с фацетом ctype определен ряд глобальных функций, перечисленных в таблице 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, позиция которого соответствует позиции символа. Далее полученный вектор используется для быстрой идентификации символов.
На следующем шаге мы рассмотрим преобразование кодировок.