您的位置:首页 > 其它

P.J.Plauger<ctype.h>

2014-11-11 21:18 218 查看
//http://www.lellansin.com/c标准库-ctype-h-_ctype转换表原理.html

博客写的很规范,借来学一下


简述

P.J.Plauger版本 C标准库 Ctype 中判断字符是否属于某个类型,主要是通过转换表来实现的。

以判断是否为小写字母为例


ctype.h 头文件


_Ctype 转换表


调用过程

中间判断的过程其实很简单,首先islower 是个带参数宏

预处理之后,假设当前的c是'a'那么变成了:

字符'a'的值为97所以接下来便是:

_Ctype[97]的转换宏是 _LO 大家可以对找下方的 _Ctype 转换表, _LO 的值又是 0x10,所以最后是:

& 运算就不说了,详细请百度“按位与”

结果就不放上来了,大家自行实验。


_Ctype 转换位

转表宏二进制十进制十六进制对应字符
_BB1000 00001280x80BEL, BS, etc.
_CN0100 0000640x40CR, FF, HT, NL, VT
_DI0010 0000320x20'0' - '9'
_LO0001 0000160x10'a' - 'z'
_PU0000 100080x08标点符号
_SP0000 010040x04空格
_UP0000 001020x02'A' - 'Z'
_XD0000 000110x01'0' - '9', 'A' - 'F', 'a' - 'f'
通过按位与上对应的宏,就可以检查该字符在转换表中对应的转表宏,二者按位与:

如与上 _LO 其值为 0001 0000,计算的时候,0与上任何数均为0,对应位全部被清零

仅保留第5位(1与上1为1,1与上0为0),所以如果只有两种结果,一个是第5位为真(16)或者为假即为0


_Ctype 转换表

二进制十进制十六进制转表宏二进制十进制十六进制ASCII值
0000 000000x00_BB1000 00001280x80空字符(Null)
0000 000110x01_BB1000 00001280x80标题开始
0000 001020x02_BB1000 00001280x80本文开始
0000 001130x03_BB1000 00001280x80本文结束
0000 010040x04_BB1000 00001280x80传输结束
0000 010150x05_BB1000 00001280x80请求
0000 011060x06_BB1000 00001280x80确认回应
0000 011170x07_BB1000 00001280x80响铃
0000 100080x08_BB1000 00001280x80退格
0000 100190x09_CN0100 0000640x40水平定位符号
0000 1010100x0A_CN0100 0000640x40换行键
0000 1011110x0B_CN0100 0000640x40垂直定位符号
0000 1100120x0C_CN0100 0000640x40换页键
0000 1101130x0D_CN0100 0000640x40Enter键
0000 1110140x0E_BB1000 00001280x80取消变换(Shift out)
0000 1111150x0F_BB1000 00001280x80启用变换(Shift in)
0001 0000160x10_BB1000 00001280x80跳出数据通讯
0001 0001170x11_BB1000 00001280x80设备控制一(XON 激活软件速度控制)
0001 0010180x12_BB1000 00001280x80设备控制二
0001 0011190x13_BB1000 00001280x80设备控制三(XOFF 停用软件速度控制)
0001 0100200x14_BB1000 00001280x80设备控制四
0001 0101210x15_BB1000 00001280x80确认失败回应
0001 0110220x16_BB1000 00001280x80同步用暂停
0001 0111230x17_BB1000 00001280x80区块传输结束
0001 1000240x18_BB1000 00001280x80取消
0001 1001250x19_BB1000 00001280x80连接介质中断
0001 1010260x1A_BB1000 00001280x80替换
0001 1011270x1B_BB1000 00001280x80退出键
0001 1100280x1C_BB1000 00001280x80文件分区符
0001 1101290x1D_BB1000 00001280x80组群分隔符
0001 1110300x1E_BB1000 00001280x80记录分隔符
0001 1111310x1F_BB1000 00001280x80单元分隔符
0010 0000320x20_SP0000 010040x04(空格,␠)
0010 0001330x21_PU0000 100080x08!
0010 0010340x22_PU0000 100080x08"
0010 0011350x23_PU0000 100080x08#
0010 0100360x24_PU0000 100080x08$
0010 0101370x25_PU0000 100080x08%
0010 0110380x26_PU0000 100080x08&
0010 0111390x27_PU0000 100080x08'
0010 1000400x28_PU0000 100080x08(
0010 1001410x29_PU0000 100080x08)
0010 1010420x2A_PU0000 100080x08*
0010 1011430x2B_PU0000 100080x08+
0010 1100440x2C_PU0000 100080x08,
0010 1101450x2D_PU0000 100080x08-
0010 1110460x2E_PU0000 100080x08.
0010 1111470x2F_PU0000 100080x08/
0011 0000480x30XDI0010 0001330x210
0011 0001490x31XDI0010 0001330x211
0011 0010500x32XDI0010 0001330x212
0011 0011510x33XDI0010 0001330x213
0011 0100520x34XDI0010 0001330x214
0011 0101530x35XDI0010 0001330x215
0011 0110540x36XDI0010 0001330x216
0011 0111550x37XDI0010 0001330x217
0011 1000560x38XDI0010 0001330x218
0011 1001570x39XDI0010 0001330x219
0011 1010580x3A_PU0000 100080x08:
0011 1011590x3B_PU0000 100080x08;
0011 1100600x3C_PU0000 100080x08<
0011 1101610x3D_PU0000 100080x08=
0011 1110620x3E_PU0000 100080x08>
0011 1111630x3F_PU0000 100080x08?
0100 0000640x40_PU0000 100080x08@
0100 0001650x41XUP0000 001130x03A
0100 0010660x42XUP0000 001130x03B
0100 0011670x43XUP0000 001130x03C
0100 0100680x44XUP0000 001130x03D
0100 0101690x45XUP0000 001130x03E
0100 0110700x46XUP0000 001130x03F
0100 0111710x47_UP0000 001020x02G
0100 1000720x48_UP0000 001020x02H
0100 1001730x49_UP0000 001020x02I
0100 1010740x4A_UP0000 001020x02J
0100 1011750x4B_UP0000 001020x02K
0100 1100760x4C_UP0000 001020x02L
0100 1101770x4D_UP0000 001020x02M
0100 1110780x4E_UP0000 001020x02N
0100 1111790x4F_UP0000 001020x02O
0101 0000800x50_UP0000 001020x02P
0101 0001810x51_UP0000 001020x02Q
0101 0010820x52_UP0000 001020x02R
0101 0011830x53_UP0000 001020x02S
0101 0100840x54_UP0000 001020x02T
0101 0101850x55_UP0000 001020x02U
0101 0110860x56_UP0000 001020x02V
0101 0111870x57_UP0000 001020x02W
0101 1000880x58_UP0000 001020x02X
0101 1001890x59_UP0000 001020x02Y
0101 1010900x5A_UP0000 001020x02Z
0101 1011910x5B_PU0000 100080x08[
0101 1100920x5C_PU0000 100080x08\
0101 1101930x5D_PU0000 100080x08]
0101 1110940x5E_PU0000 100080x08^
0101 1111950x5F_PU0000 100080x08_
0110 0000960x60_PU0000 100080x08`
0110 0001970x61XLO0001 0001170x11a
0110 0010980x62XLO0001 0001170x11b
0110 0011990x63XLO0001 0001170x11c
0110 01001000x64XLO0001 0001170x11d
0110 01011010x65XLO0001 0001170x11e
0110 01101020x66XLO0001 0001170x11f
0110 01111030x67_LO0001 0000160x10g
0110 10001040x68_LO0001 0000160x10h
0110 10011050x69_LO0001 0000160x10i
0110 10101060x6A_LO0001 0000160x10j
0110 10111070x6B_LO0001 0000160x10k
0110 11001080x6C_LO0001 0000160x10l
0110 11011090x6D_LO0001 0000160x10m
0110 11101100x6E_LO0001 0000160x10n
0110 11111110x6F_LO0001 0000160x10o
0111 00001120x70_LO0001 0000160x10p
0111 00011130x71_LO0001 0000160x10q
0111 00101140x72_LO0001 0000160x10r
0111 00111150x73_LO0001 0000160x10s
0111 01001160x74_LO0001 0000160x10t
0111 01011170x75_LO0001 0000160x10u
0111 01101180x76_LO0001 0000160x10v
0111 01111190x77_LO0001 0000160x10w
0111 10001200x78_LO0001 0000160x10x
0111 10011210x79_LO0001 0000160x10y
0111 10101220x7A_LO0001 0000160x10z
0111 10111230x7B_PU0000 100080x08{
0111 11001240x7C_PU0000 100080x08|
0111 11011250x7D_PU0000 100080x08}
0111 11101260x7E_PU0000 100080x08~
0111 11111270x7F_BB1000 00001280x80删除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: