ctype.h



ctype.h — заголовочный файл стандартной библиотеки языка программирования С, содержащий объявления функций для классификации и преобразования отдельных символов.

Функции

Все перечисленные ниже функции имеют прототипы следующего вида:

int имя_функции( int );

Все эти функции принимают в качестве аргумента int-эквивалент символа и возвращают значение типа int, которое может представлять или другой символ (в случае функций преобразования), или логическое значение: 0 означает «Ложь», а отличное от нуля значение — «Истина» (это относится к функциям классификации).

Поведение этих функций зависит от текущей кодировки.

Результат применения этих функций к символам с кодами, принадлежащими расширенной кодировке времени выполнения (англ. extended execution characterset) зависит от платформы и локализации.

Функции классификации

#include <ctype.h> int isalnum(int c); //Если аргумент функции является либо буквой, либо цифрой, она возвращает ненулевое значение. int isalpha(int c); //Возвращает ненулевое значение, если её аргумент является буквой, в противном случае возвращается нуль. int isblank(int c); //Возвращает true, если с - пробел или горизонтальная табуляция (С99). int iscntrl(int c); //Возвращает true, если с - управляющий символ, такой как <Ctrl+B>. int isdigit(int c); //Возвращает ненулевое значение, если её аргумент является десятичной цифрой, в противном случае возвращается нуль. int isgraph(int c); //Возвращает true, если с - печатаемый символ, отличный от пробела. int islower(int c); //Возвращает true, если с - символ нижнего регистра. int isprint(int c); //Возвращает true, если с — печатаемый символ. int ispunct(int c); //Возвращает true, если с - знак препинания (любой печатаемый символ, отличный от пробела или алфавитно-цифрового символа). int isspace(int c); //Возвращает true, если с — пробельный символ: пробел, новая строка,перевод страницы, возврат каретки, вертикальная табуляция, горизонтальная табуляция или, возможно, другой символ, определяемый реализацией int isupper(int c); //Возвращает true, если с - символ верхнего регистра. int isxdigit(int c); //Возвращает true, если с — шестнадцатеричная цифра.

Эти функции проверяют, является ли аргумент буквой или цифрой, пробелом или табуляцией, управляющим символом, десятичным числом, печатным символом (кроме пробела), символом в нижнем регистре, печатным символом (в том числе пробелом), пробелом, символом в верхнем регистре или шестнадцатиричным числом.

Функции преобразования

#include <ctype.h> int toupper(int c); // переводит буквы нижнего регистра в верхний регистр int tolower(int c); // переводит буквы верхнего регистра в нижний регистр

Функции преобразуют символ c в нижний или верхний регистр, если это возможно. В противном случае они возвращают неизменённое значение.

Реализация функций

В большинстве библиотек языка 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), поэтому здесь преобразование не требуется.

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <locale.h> #include <ctype.h> #include <string.h> int main() { setlocale(LC_ALL, "RUS"); char s[100]; int i, ind, n; //Исходные данные char ch[4]; printf("Введите А, B и C, без пробелов:"); gets_s(ch); printf("Введите текст: "); gets_s(s); //gets(функция, входящая в Стандартную библиотеку языка Си, объявляемая в заголовочном файле stdio.h , которая считывает строку стандартного ввода и помещает её в буфер, созданный вызывающей функцией). n = strlen(s); //strlen(видит начало строки и начинает сначала считать количество символов (байтов, отводимых под каждый if (islower(ch[1]) || islower(ch[2])) //принимает в качестве аргумента один символ (букву) и возвращает ненулевое целое значение в том случае, если буква является строчной, и нулевое, если буква является заглавной ch[1] = ch[1] - 32; ch[2] = ch[2] - 32; for (i = 0; i< n; i++) { if (s[i] == ch[0]) { ind = i; if (isdigit(s[i - 1])) //isdigit (Функция isdigit проверяет аргумент, передаваемый через параметр сharacter, является ли он десятичной цифрой. { break; } else { s[i] = ch[1]; } } } for (i = n + 1; i>ind; i--) { s[i] = s[i - 1]; } s[ind + 1] = ch[2]; puts(s); _getch(); }


Примеры использования

//Следующий код считывает символ и преобразует его в //число типа 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 entered a number %i ", atoi((char*)&c) ); else printf( "It is not a number! " ); } return 0; }