作为强类型语言,C语言自其诞生以来,就通过类型来为程序员们增加重重阻碍。为了避免各种麻烦,早在上古时期,C语言的程序员们就写了大量判别变量类型的代码段,这些代码段也很快就走进了C语言的标准库。
ctype中共有11个鉴别字符类型的函数,这些函数的输入输出均为int型,但又不完全是int型。输入的int是通过强转得到的;输出为0和1,即布尔型。
| 返回1的情况 | ASCII码位置 | 十六进制 | |
|---|---|---|---|
| isalnum | 字母和数字 | 48-57, 65-90, 97-122 | 30-39, 41-5A, 61-7A |
| isalpha | 字母 | 65-90, 97-122 | 41-5A, 61-7A |
| isupper | 大写字母 | 65-90 | 41-5A |
| islower | 小写字母 | 97-122 | 61-7A |
| iscntrl | 控制字符 | 0-31,127 | 00-1F, 7F |
| isdigit | 十进制数字 | 48-57 | 30-39 |
| isxdigit | 十六进制数字 | 48-57, 48-53, 97-102 | 30-39,41-46, 61-66 |
| isgraph | 图形字符 | 33-126 | 21-7E |
| isprint | 可打印 | 32-126 | 20-7E |
| ispunct | 标点符号 | 33-47, 58-64 91-96, 123-126 | 21-2F, 3A-40 5B-60, 7B-7E |
| isspace | 空白字符 | 9-13,32 | 09-0D, 20 |
这些函数之间可由下图表示
此外,ctype中还封装了两个大小写转换的函数:int tolower(int c)和int toupper(int c),这两个函数很容易实现,只要看一下十六进制下的ASCII即可发现。
前32个字符为控制符
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
| 1 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
32-126为可打印字符,其中20为空格,即大小写字母正好差了0x20。
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | ! | " | # | $ | % | & | ’ | ( | ) | * | + | , | - | . | / | |
| 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | ] | ^ | _ | |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |



