引言
cctype是C++对ctype.h头文件的封装,这个文件里面定义了一系列字符识别和转换函数,我们一起来看看它们的作用和具体实现。
cctype头文件
源码位置
www.aospxref.com/android-12.…
跳转到www.aospxref.com/android-12.…
字符识别函数
isalnum---识别字符是否是字母或数字
这里使用的是查表的方式进行判断,我们知道A-Z是0x41-0x5A,a-z是0x61-0x7A,0-9是0x30-0x39。
_CTYPE_U = 0x01,_CTYPE_L = 0x02,_CTYPE_N = 0x04,即第0位为1,第一位为1,第二位为1。 我们再来看看_ctype_表
www.aospxref.com/android-12.…
对应字母,数字的位置,进行了标记,由于跳过了第0位,所以检测时加一即可。
isalpha---识别字符是否是字母
这里的逻辑很简单,判断输入值是否在A-Z或a-z之间即可
isblank---识别字符是否是空白
判断输入值是否是' '或者制表符'\t'即可
iscntrl---识别字符是否是控制字符
根据ASCII码表,0x00-0x1f,0x7f,是控制字符,0x32是空格符' ',所以值小于空格符,或者等于0x7f都是控制字符。
__BIONIC_CAST的作用是转换为static_cast<unsigned>(__ch),避免int出现越界判断。
isdigit---识别字符是否是数字
判断输入值是否在数字之间即可
isgraph---识别是否是有图形的
从0x21的'!'到最后的0x7e'~'都是有图形的
islower---识别是否是小写字母字符
判断输入值在'a'-'z'之间即可
isprint---识别是否是可打印的
从0x20的' '到最后的0x7e'~'都是可打印的
ispunct---识别是否是标点符号
这里的判断方式与isalnum相似,通过查表获得
isspace---识别是否是空格
只有以下字符为空格
-
' '
(0x20)space (SPC) -
'\t'
(0x09)horizontal tab (TAB) -
'\n'
(0x0a)newline (LF) -
'\v'
(0x0b)vertical tab (VT) -
'\f'
(0x0c)feed (FF) -
'\r'
(0x0d)carriage return (CR)
isupper---识别是否是大写字母
判断输入值在'A'-'Z'之间即可
isxdigit---识别是否是十六进制数字
判断输入值是否满足[0-9A-Fa-f]即可
增加的isascii函数---实际通过判断输入值是否小于128来判断是否是ASCII码
字符转换函数
tolower---将大写字符转换为小写
核心是将输入的大写字符与0x20做或运算,实际上就是加上32,A-Z是0x41-0x5A,a-z是0x61-0x7A,验证是可以的。
toupper---将小写字母转换为大写
核心是用小写字母与0x20做异或运算,具体原理可以参看位运算的巧妙使用 -- 字母大小写转换
增加的toascii函数---通过输入值与0x7f做与运算,截断低7位转换为有效的ASCII码
以上就是ctype.h文件的全部内容