C++ 学习 ------cctype 头文件的作用与源码学习
引言
cctype 是 C++对 ctype.h 头文件的封装,这个文件里面定义了一系列字符识别和转换函数,我们一起来看看它们的作用和具体实现。
cctype 头文件
源码位置
http://www.aospxref.com/android-12.0.0_r3/xref/bionic/libc/include/ctype.h
跳转到http://www.aospxref.com/android-12.0.0_r3/xref/bionic/libc/include/bits/ctype_inlines.h
字符识别函数
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_表
http://www.aospxref.com/android-12.0.0_r3/xref/bionic/libc/upstream-openbsd/lib/libc/gen/ctype_.c
对应字母,数字的位置,进行了标记,由于跳过了第 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 文件的全部内容。
版权声明: 本文为 InfoQ 作者【桑榆】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc18920678b38eb8efb7e8541】。文章转载请联系作者。
评论