ctype.h属于c语言标准库头文件,提供了数字和字符的判别与大小写转化函数。
接口:判断正确返回非零值,错误返回零
int islower(unsigned char); //是否为小写字母。
int isupper(char); //是否为大写字母。
int isalpha(char); //是否为字母。
int isdigit(char); //是否为数字。
int isxdigit(char); //是否为16进制数。
int isalnum(char); //是否为数字字母,也就是数字,字母,数字和字母。
int ispunct(char); //是否为标点符号。
int isgraph(char); //是否为除空格以外的,所有可打印出来的字符。
int isprint(char); //是否为包括空格的,所有可打印出来的字符。
int isspace(char); //是否为空格,换页符,换行符,回车符,水平制表符,垂直制表符。
int iscntrl(char); //是否为控制字符。
int tolower(char); //转换为小写
int toupper(char); //转换为大写
实现:
出于运行速度考虑,以上函数都是用宏实现的。但标准库中也提供的(function)形式的函数实现,很少用到。
#define islower(c) (_Ctype[(int)(c)] & _LO)
#define isupper(c) (_Ctype[(int)(c)] & _UP)
#define isalpha(c) (_Ctype[(int)(c)] & (_LO | _UP | _XA))
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
#define isxdigit(c) (_Ctype[(int)(c)] & _XD)
#define isalnum(c) (_Ctype[(int)(c)] & (_DI | _LO | _UP | _XA))
#define ispunct(c) (_Ctype[(int)(c)] & _PU)
#define isgraph(c) (_Ctype[(int)(c)] & (_DT | _LO | _PU | _UP | XA))
#define isprint(c) (_Ctype[(int)(c)] & (_DI | _LO | _PU | _SP | _UP | _XA))
#define isspace(c) (_Ctype[(int)(c)] & (_CN | _SP | _XS))
#define iscntrl(c) (_Ctype[(int)(c)] & (_BB | _CN))
#define tolower(c) _Tolower[(int)(c)]
#define toupper(c) _Toupper[(int)(c)]
下面对以上宏定义进行分析:
_Ctype _Tolower _Toupper 是三个short型指针,之所以是short,是因为其要操作的三个数组皆为const short型。
这三个数组也是实现这些宏所定义的功能的关键。
在这之前,先给出辅助宏的定义,辅助宏的作用就是在通过位与运算得到函数结果值时提供“基准”。
#define _XA 0x200 //额外字母
#define _XS 0x100 //额外空格
#define _BB 0x80 //BEL, BS,etc.
#define _CN 0x40 //CR, FF, HT, NL, VT
#define _DI 0x20 //'0' - '9'
#define _LO 0x10 //'a' - 'z'
#define _PU 0x08 //符号
#define _SP 0x04 //空格
#define _UP 0x02 //'A' - 'Z'
#define _XD 0x01 //'0' - '9', 'A' - 'F', 'a' - 'f'
可以看到这些辅助宏都是一些16进制数。
而_Ctype _Tolower _Toupper 这三个指针操作的数组内容太大,具体可参见《c标准库》p40~p42
_Ctype数组对应于ASCI码的各个符号创建掩码。
其中_Ctype操作的数组要注意由于EOF的存在,所以_Ctype从数组第二位开始操作。
通过将参数c转化为ASCI码,并将其在_Ctype操作的数组的对应位置的掩码与基准做位与运算即可得出结果。
结果为0,判断错误。结果为非零,判断正确。
_Tolower和_Toupper则比较简单,将参数c转化成ASCI码后,直接从对方操作的数组(_Tolower操作的数组与_Toupper操作的数组)中取得对应位置的值即可。在这两个数组中字母部分不是掩码。而是,一个是小写字母,一个是大写字母。