博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Minix中的字符判定ctype.c
阅读量:6527 次
发布时间:2019-06-24

本文共 3034 字,大约阅读时间需要 10 分钟。

minix中关于如何判定一个字符的类型,如大写、小写、数字……

如果采用传统的方法,如判断一个字母大写的方法:

if(c>='A' && c<'Z')  return true;

但是如果判断一个字符是数字或是字母,则采用下面的代码:

if((c<'z' && c>'a') || (c<'Z' && c>'A') || (c>'0' && c<'9'))  return true

如果假设更多的局限,效率明显下降

minix的做法是定义一个256元素的unsigned char _ctypes[]数组,由于8位需要8种属性分别描述,如下:

#define _U        0x01    /* this bit is for upper-case letters [A-Z] */#define _L        0x02    /* this bit is for lower-case letters [a-z] */#define _N        0x04    /* this bit is for numbers [0-9] */#define _S        0x08    /* this bit is for white space \t \n \f etc */#define _P        0x10    /* this bit is for punctuation characters */#define _C        0x20    /* this bit is for control characters */#define _X        0x40    /* this bit is for hex digits [a-f] and [A-F]*/#define    _PROTOTYPE(function, params)    function params

判断字符函数原型:

_PROTOTYPE( int isalnum, (int  _c)  );    /* alphanumeric [a-z], [A-Z], [0-9] */_PROTOTYPE( int isalpha, (int  _c)  );    /* alphabetic */_PROTOTYPE( int iscntrl, (int  _c)  );    /* control characters */_PROTOTYPE( int isdigit, (int  _c)  );    /* digit [0-9] */_PROTOTYPE( int isgraph, (int  _c)  );    /* graphic character */_PROTOTYPE( int islower, (int  _c)  );    /* lower-case letter [a-z] */_PROTOTYPE( int isprint, (int  _c)  );    /* printable character */_PROTOTYPE( int ispunct, (int  _c)  );    /* punctuation mark */_PROTOTYPE( int isspace, (int  _c)  );    /* white space sp, \f, \n, \r, \t, \v*/_PROTOTYPE( int isupper, (int  _c)  );    /* upper-case letter [A-Z] */_PROTOTYPE( int isxdigit,(int  _c)  );    /* hex digit [0-9], [a-f], [A-F] */_PROTOTYPE( int tolower, (int  _c)  );    /* convert to lower-case */_PROTOTYPE( int toupper, (int  _c)  );    /* convert to upper-case */

以上函数都是通过宏定义:

#define isalnum(c)    ((__ctype+1)[c]&(_U|_L|_N))#define isalpha(c)    ((__ctype+1)[c]&(_U|_L))#define iscntrl(c)    ((__ctype+1)[c]&_C)#define isgraph(c)    ((__ctype+1)[c]&(_P|_U|_L|_N))#define ispunct(c)    ((__ctype+1)[c]&_P)#define isspace(c)    ((__ctype+1)[c]&_S)#define isxdigit(c)    ((__ctype+1)[c]&(_N|_X))#define isdigit(c)    ((unsigned) ((c)-'0') < 10)#define islower(c)    ((unsigned) ((c)-'a') < 26)#define isupper(c)    ((unsigned) ((c)-'A') < 26)#define isprint(c)    ((unsigned) ((c)-' ') < 95)#define isascii(c)    ((unsigned) (c) < 128)

minix将_ctype[]初始化为:

char __ctype[] = {0,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_C,_S,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_N,_N,_N,_N,_N,_N,_N,_N,_N,_N,_P,_P,_P,_P,_P,_P,_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_P,_P,_P,_P,_P,_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_P,_P,_P,_P,_C,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
C代码

 

转载地址:http://zotbo.baihongyu.com/

你可能感兴趣的文章
自定义类加载器
查看>>
MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)
查看>>
C++构造函数例程
查看>>
把某一列值转换为逗号分隔字符串
查看>>
DLL,DML,DCL,TCL in Oracle
查看>>
android之存储篇_存储方式总览
查看>>
SSE指令集学习:Compiler Intrinsic
查看>>
两种attach to process的方法
查看>>
WCF如何使用X509证书(安装和错误)(二)
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>
iOS中--NSArray调用方法详解 (李洪强)
查看>>
java异步操作实例
查看>>
Centos6.8防火墙配置
查看>>
php and web service with wsdl
查看>>
JAVA多线程的问题以及处理【转】
查看>>
【Java面试题】10 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?...
查看>>
简单记录一次ORA-00600 kcratr_nab_less_than_odr
查看>>
如何新建UML2项目?详细操作步骤介绍
查看>>
[精讲17] 组策略
查看>>
控制流
查看>>