C头文件ctype.h接口与实现

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操作的数组)中取得对应位置的值即可。在这两个数组中字母部分不是掩码。而是,一个是小写字母,一个是大写字母。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值