- ctype.h
-
Стандартная библиотека
языка программирования Сctype.h — заголовочный файл стандартной библиотеки языка программирования С, содержащий объявления функций для классификации и преобразования отдельных символов.
Содержание
Функции
Все перечисленные ниже функции имеют прототипы следующего вида:
int имя_функции( int );
Все эти функции принимают в качестве аргумента
int
-эквивалент символа и возвращают значение типаint
, которое может представлять или другой символ (в случае функций преобразования), или логическое значение: 0 означает «Ложь», а отличное от нуля значение — «Истина» (это относится к функциям классификации).Поведение этих функций зависит от текущей кодировки.[1]
Результат применения этих функций к символам с кодами, принадлежащими расширенной кодировке времени выполнения (англ. extended execution characterset) зависит от платформы и локализации.
Функции классификации
#include <ctype.h> int isalnum(int c); //Если аргумент функции является либо буквой, либо цифрой, она возвращает ненулевое значение. int isalpha(int c); //Возвращает ненулевое значение, если ее аргумент является буквой, в противном случае возвращается нуль. int isblank(int c); int iscntrl(int c); int isdigit(int c); int isgraph(int c); int islower(int c); int isprint(int c); int ispunct(int c); int isspace(int c); int isupper(int c); int isxdigit(int c);
Эти функции проверяют, является ли аргумент буквой или цифрой, пробелом или табуляцией, управляющим символом, десятичным числом, печатным символом (кроме пробела), символом в нижнем регистре, печатным символом (в том числе пробелом), пробелом, символом в верхнем регистре или шестнадцатиричным числом.
Функции преобразования
#include <ctype.h> int tolower(int c); int toupper(int c);
Функции преобразуют символ c в нижний или верхний регистр, если это возможно. В противном случае они возвращают неизменённое значение.[1]
Реализация функций
В большинстве библиотек языка C подпрограммы классификации используют статические таблицы поиска вместо макросов или функций. Например, создается массив из 256 восьмибитовых целых чисел, где каждый бит означает определенное свойство символа (является цифрой, буквой и т. д.). Если бит 1 показывает, цифра данный символ или нет, то код мог бы быть записан так:
#define isdigit(x) (TABLE[x] & 1)
Ранние версии Linux использовали потенциально опасный код, подобный следующему:
#define isdigit(x) ((x) >= '0' && (x) <= '9')
Это могло вызвать проблемы, если в качестве аргумента использовался, например, вызов функции. В таком случае сразу не было видно, что функция вызывается дважды.
Неправильное использование
- Во всех случаях аргумент имеет тип
int
, причем его значение должно принадлежать диапазону значений типаunsigned char
, или же быть равным значению макроконстанты EOF. Если аргумент имеет любое другое значение, поведение функций не определено.
Тип
char
в зависимости от реализации может быть как знаковым, так и беззнаковым. Если типchar
является знаковым, то неявное преобразование вint
может привести к появлению отрицательных чисел, что вызовет неопределенное поведение функции. Чаще всего происходит выход за пределы таблицы поиска и аварийное завершение программы.//Этот код может работать некорректно. char test = 'b'; toupper( 'a' ); int res = ispunct( test );
Чтобы избежать этого, используя
char
-аргументы, сперва явно преобразуйте их вint
.int
-значения, возвращаемые функциямиgetchar
,getc
,fgetc
обязательно принадлежат диапазону значений типаunsigned char
(или равны EOF), поэтому здесь преобразование не требуется.Примеры использования
//Следующий код считывает символ и преобразует его в //число типа int, если введена цифра. #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main (void) { int c = fgetc(stdin); if (c != EOF) { if ( isdigit(c) ) printf( "You have input a number %i\n", atoi((char*)&c) ); else printf( "It is not a number!\n" ); } return 0; }
Ссылки
ctype.h
— основные определения, The Single UNIX® Specification, выпуск 7 от The Open Group (англ.)- ctype.h на C++ Reference
Примечания
Категория:- Стандартные библиотечные заголовки языка Си
- Во всех случаях аргумент имеет тип
Wikimedia Foundation. 2010.