Файл ctype.h предоставляет определение ряда функций, которые позволяют проверить тип символа.
Функция isspace() позволяет проверить, является ли символ пробелом. Причем в данном случае "пробел" представляет как собственно пробел, так и табуляцию, перевод строки, возврат каретки. Если символ не является пробелом, то функция возвращает 0. Если символ является пробелом, то функция возвращает ненулевое значение. Например:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = ' ';
char c3 = '\n';
char c4 = '\t';
char c5 = '\r';
printf("isspace(c1): %d\n", isspace(c1));
printf("isspace(c2): %d\n", isspace(c2));
printf("isspace(c3): %d\n", isspace(c3));
printf("isspace(c4): %d\n", isspace(c4));
printf("isspace(c5): %d\n", isspace(c5));
return 0;
}
Здесь непробельным символом является только переменная c1, поэтому isspace(c1) возвращает 0. Остальные символы представляют "пробелы". Консольный вывод:
isspace(c1): 0 isspace(c2): 8192 isspace(c3): 8192 isspace(c4): 8192 isspace(c5): 8192
Функция isalnum() проверяет, является ли аргумент цифрой или алфавитным символом. Если в функцию передан алфавитный символ или цифра, то функция возвращает ненулевое значение (например, 1). В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '3';
char c3 = ' ';
char c4 = '\t';
char c5 = '+';
printf("isalnum(c1): %d\n", isalnum(c1)); // isalnum(c1): 1
printf("isalnum(c2): %d\n", isalnum(c2)); // isalnum(c2): 1
printf("isalnum(c3): %d\n", isalnum(c3)); // isalnum(c3): 0
printf("isalnum(c4): %d\n", isalnum(c4)); // isalnum(c4): 0
printf("isalnum(c5): %d\n", isalnum(c5)); // isalnum(c5): 0
return 0;
}
Функция isalpha() проверяет, является ли аргумент алфавитным символом. Если в функцию передан алфавитный символ, то функция возвращает ненулевое значение (например, 1). В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '3';
char c3 = ' ';
char c4 = '\t';
char c5 = '+';
printf("isalpha(c1): %d\n", isalpha(c1)); // isalpha(c1): 1024
printf("isalpha(c2): %d\n", isalpha(c2)); // isalpha(c2): 0
printf("isalpha(c3): %d\n", isalpha(c3)); // isalpha(c3): 0
printf("isalpha(c4): %d\n", isalpha(c4)); // isalpha(c4): 0
printf("isalpha(c5): %d\n", isalpha(c5)); // isalpha(c5): 0
return 0;
}
Функция isdigit() проверяет, является ли аргумент цифрой. Если в функцию передана цифра, то функция возвращает ненулевое значение (например, 1). В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '3';
char c3 = ' ';
char c4 = '\t';
char c5 = '+';
printf("isdigit(c1): %d\n", isdigit(c1)); // isdigit(c1): 0
printf("isdigit(c2): %d\n", isdigit(c2)); // isdigit(c2): 2048
printf("isdigit(c3): %d\n", isdigit(c3)); // isdigit(c3): 0
printf("isdigit(c4): %d\n", isdigit(c4)); // isdigit(c4): 0
printf("isdigit(c5): %d\n", isdigit(c5)); // isdigit(c5): 0
return 0;
}
Функция isxdigit() проверяет, является ли символ шестнадцатеричной цифрой, то есть также может представлять алфавитные символы A/a, B/b, C/c, D/d, E/e, F/f:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = '3';
char c2 = 'e';
char c3 = 'E';
char c4 = 'H';
char c5 = '\0';
printf("isxdigit(c1): %d\n", isxdigit(c1)); // isxdigit(c1): 4096
printf("isxdigit(c2): %d\n", isxdigit(c2)); // isxdigit(c2): 4096
printf("isxdigit(c3): %d\n", isxdigit(c3)); // isxdigit(c3): 4096
printf("isxdigit(c4): %d\n", isxdigit(c4)); // isxdigit(c4): 0
printf("isxdigit(c5): %d\n", isxdigit(c5)); // isxdigit(c5): 0
return 0;
}
Функция iscntrl() проверяет, является ли аргумент управляющей последовательностью (например, \n, \t и т.д.). Если аргумент - управляющая последовательность, то возвращается ненулевое значение. В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '\0';
char c3 = ' ';
char c4 = '\t';
char c5 = '\\';
printf("iscntrl(c1): %d\n", iscntrl(c1)); // iscntrl(c1): 0
printf("iscntrl(c2): %d\n", iscntrl(c2)); // iscntrl(c2): 2
printf("iscntrl(c3): %d\n", iscntrl(c3)); // iscntrl(c3): 0
printf("iscntrl(c4): %d\n", iscntrl(c4)); // iscntrl(c4): 2
printf("iscntrl(c5): %d\n", iscntrl(c5)); // iscntrl(c5): 0
return 0;
}
Обратите внимание, что наличие слеша перед символом не обязательно означает управляющую последовательность и может применяться лишь для экранирования, например, "\\" или "'"
Функция isprint() является антиподом функции iscntrl() - она проверяет, является ли аргумент печатаемым символом. Если аргумент - печатаемый символ, то возвращается ненулевое значение. В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '\0';
char c3 = ' ';
char c4 = '\t';
char c5 = '\';
printf("isprint(c1): %d\n", isprint(c1)); // isprint(c1): 16384
printf("isprint(c2): %d\n", isprint(c2)); // isprint(c2): 0
printf("isprint(c3): %d\n", isprint(c3)); // isprint(c3): 16384
printf("isprint(c4): %d\n", isprint(c4)); // isprint(c4): 0
printf("isprint(c5): %d\n", isprint(c5)); // isprint(c5): 16384
return 0;
}
Также обратите внимание, что пробел является печатаемым символом, хотя он и не имеет графическом воплощения.
Функция isgraph() проверяет, имеет ли символ графическое представление. Если это графический символ, то функция возвращает ненулевое значение. В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '3';
char c3 = ' ';
char c4 = '\t';
char c5 = '\0';
printf("isgraph(c1): %d\n", isgraph(c1)); // isgraph(c1): 32768
printf("isgraph(c2): %d\n", isgraph(c2)); // isgraph(c2): 32768
printf("isgraph(c3): %d\n", isgraph(c3)); // isgraph(c3): 0
printf("isgraph(c4): %d\n", isgraph(c4)); // isgraph(c4): 0
printf("isgraph(c5): %d\n", isgraph(c5)); // isgraph(c5): 0
return 0;
}
Функция ispunct() проверяет, является ли аргумент пунктуационным символом (точка, запятая и т.д.). Если аргумент - пунктуационный символ, то возвращается ненулевое значение. В остальных случаях возвращается 0:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = '\"';
char c3 = ',';
char c4 = '>';
char c5 = '\n';
printf("ispunct(c1): %d\n", ispunct(c1)); // ispunct(c1): 0
printf("ispunct(c2): %d\n", ispunct(c2)); // ispunct(c2): 4
printf("ispunct(c3): %d\n", ispunct(c3)); // ispunct(c3): 4
printf("ispunct(c4): %d\n", ispunct(c4)); // ispunct(c4): 4
printf("ispunct(c5): %d\n", ispunct(c5)); // ispunct(c5): 0
return 0;
}
Или, к примеру, выведем все пунктуационные символы:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// все символы пунктуации
for (int i = 0; i <= 127; ++i){
if(ispunct(i)) printf("%c ", i);
}
return 0;
}
Результат:
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
Функция islower() проверяет, представляет ли аргумент алфавитный символ в нижнем регистре. Если это алфавитный символ в нижнем регистре, то функция возвращает ненулевое значение. В остальных случаях возвращается 0. Аналогично функция islower() проверяет, представляет ли аргумент алфавитный символ в верхнем регистре:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = 'T';
char c3 = '\t';
char c4 = '5';
printf("islower(c1): %d\n", islower(c1)); // islower(c1): 512
printf("islower(c2): %d\n", islower(c2)); // islower(c2): 0
printf("islower(c3): %d\n", islower(c3)); // islower(c3): 0
printf("islower(c4): %d\n", islower(c4)); // islower(c4): 0
printf("isupper(c1): %d\n", isupper(c1)); // isupper(c1): 0
printf("isupper(c2): %d\n", isupper(c2)); // isupper(c2): 256
printf("isupper(c3): %d\n", isupper(c3)); // isupper(c3): 0
printf("isupper(c4): %d\n", isupper(c4)); // isupper(c4): 0
return 0;
}
Функция tolower() переводит алфавитный символ в нижний регистр. Если символ уже в нижнем регистре или вообще не является алфавитным символом, то ничего не происходит. Аналогично функция tolower() переводит алфавитный символ в верхний регистр:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c1 = 't';
char c2 = 'T';
char c3 = '5';
printf("tolower(c1): %c\n", tolower(c1)); // tolower(c1): t
printf("tolower(c2): %c\n", tolower(c2)); // tolower(c2): t
printf("tolower(c3): %c\n", tolower(c3)); // tolower(c3): 5
printf("toupper(c1): %c\n", toupper(c1)); // toupper(c1): T
printf("toupper(c2): %c\n", toupper(c2)); // toupper(c2): T
printf("toupper(c3): %c\n", toupper(c3)); // toupper(c3): 5
return 0;
}