Классификация символов C
Эта статья нуждается в дополнительных цитатах для проверки . ( октябрь 2011 г. ) |
Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
Классификация символов C — это операция, предоставляемая группой функций стандартной библиотеки ANSI C для языка программирования C. Эти функции используются для проверки символов на принадлежность к определенному классу символов, например, буквенные символы, управляющие символы и т. д. Поддерживаются как однобайтовые, так и широкие символы. [1]
История
[ редактировать ]Первые программисты языка C, работавшие над операционной системой Unix, разработали идиомы программирования для классификации символов по различным типам. Например, для набора символов ASCII следующее выражение идентифицирует букву, если ее значение истинно :
('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')
Поскольку это может быть выражено в нескольких формулировках, стало желательным ввести короткие стандартизированные формы таких тестов, которые были бы помещены в общесистемный заголовочный файл ctype.h .
Выполнение
[ редактировать ]В отличие от приведенного выше примера, процедуры классификации символов не написаны как сравнительные тесты. В большинстве библиотек C они написаны как поиск по статическим таблицам, а не как макросы или функции.
Например, создается массив из 256 восьмибитных целых чисел, организованных в виде битовых полей, где каждый бит соответствует определенному свойству символа, например, isdigit, isalpha. Если младший бит целых чисел соответствует свойству isdigit, код можно записать как
#define isdigit(x) (TABLE[x] & 1)
Ранние версии Linux использовали потенциально ошибочный метод, аналогичный первому примеру кода:
#define isdigit(x) ((x) >= '0' && (x) <= '9')
Это может вызвать проблемы, если при раскрытии макроса выражение, замененное на x, будет иметь побочный эффект . Например, если кто-то вызывает isdigit(x++) или isdigit(run_some_program()) . Не сразу очевидно, что аргумент isdigit вычисляется дважды. По этой причине обычно используется табличный подход.
Обзор функций
[ редактировать ]Функции, работающие с однобайтовыми символами, определены в ctype.h заголовочном файле ( cctype в C++). Функции, работающие с широкими символами, определены в wctype.h заголовочном файле ( cwctype в C++).
Классификация оценивается в соответствии с действующим языковым стандартом.
Байт характер |
Широкий характер |
Описание |
---|---|---|
isalnum
|
iswalnum
|
проверяет, является ли операнд буквенно-цифровым |
isalpha
|
iswalpha
|
проверяет, является ли операнд алфавитным |
islower
|
iswlower
|
проверяет, является ли операнд строчной буквой |
isupper
|
iswupper
|
проверяет, является ли операнд заглавной буквой |
isdigit
|
iswdigit
|
проверяет, является ли операнд цифрой |
isxdigit
|
iswxdigit
|
проверяет, является ли операнд шестнадцатеричным |
iscntrl
|
iswcntrl
|
проверяет, является ли операнд управляющим символом |
isgraph
|
iswgraph
|
проверяет, является ли операнд графическим символом |
isspace
|
iswspace
|
проверяет, является ли операнд пробелом |
isblank
|
iswblank
|
проверяет, является ли операнд символом пробела |
isprint
|
iswprint
|
проверяет, является ли операнд печатным символом |
ispunct
|
iswpunct
|
проверяет, является ли операнд знаком пунктуации |
tolower
|
towlower
|
преобразует операнд в нижний регистр |
toupper
|
towupper
|
преобразует операнд в верхний регистр |
— | iswctype
|
проверяет, попадает ли операнд в определенный класс |
— | towctrans
|
преобразует операнд, используя определенное сопоставление |
— | wctype
|
возвращает класс широких символов, который будет использоваться с iswctype
|
— | wctrans
|
возвращает преобразование, которое будет использоваться с towctrans
|
Ссылки
[ редактировать ]- ^ Спецификация ISO/IEC 9899:1999 (PDF) . п. 193, § 7.4.
Внешние ссылки
[ редактировать ]