Minix中的字元判定ctype c

2022-02-08 04:43:27 字數 3000 閱讀 2796

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 =;
c**

minix中atoi atol atof的實現

在minix2.0源 中,有將字串型別轉換為int long double型別的函式實現,相關的實現函式分別在atoi.c atol.c atof.c檔案中,我們來逐一學習其中的原始碼 int atoi register const char nptr while isdigit nptr retu...

minix中時間轉換的實現(asctime c)

在minix2.0源 中,有相當經典的時間轉換函式實現 src src lib ansi asctime.c 今天我們就來分析一下asctime.c中的原始碼 首先引入幾個相關的標頭檔案 1 time.h 主要的結構體與相關定義 struct tm char asctime const struct...

關於PHP中變數的判定

由於php解釋性語言,所以乙個變數即使沒有定義也可以被使用而不會引起error。請看下面這個例子 輸出的結果是 empty no set null no defined case 0 有其實最後乙個switch判斷,這是乙個比較隱晦的錯誤,所以在使用前進行一次判斷還是有意義的。同時我們可以看到有些的...