ctype.h 主要提供了一些函數用以測試字符或字符處理的功能函數;包括字符判斷檢測、字符轉換;
目前ASCII字符可分為以下一些類型,如:大寫、小寫、字母、數字、十六進制、空白字符、可打印字符、控制字符、字母數字、標點符號等,部分類型可能會重疊;
ctype.h提供了如下字符處理函數;
int isalnum(int c):檢查字符是否為數字或字母;(0~9,a~z,A~Z)
int isalpha(int c):檢查字符是否為字母;(a~z, A~Z)
int iscntrl(int c):檢查字符是否為控制字符;(八進制000~037以及177的字符)
int isdigit(int c):檢查字符是否為十進制數字;(0~9)
int isgraph(int c):檢查字符是否為圖形表示,依賴於使用語言的環境;0~9,a~z,A~Z,以及標點符號)
int islower(int c):檢查字符是否為小寫的字母;(a~z)
int isprint(int c):檢查字符是否為可打印的;(數字、字母、標點符號、空白字符)
int ispunct(int c):檢查字符是否為標點符號;(! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~等)
int isspace(int c):檢查字符是否為空白字符;(TAB、換行、垂直TAB、換頁、回車、空格)
int isupper(int c):檢查字符是否為大寫字母;(A~Z)
int isxdigit(int c):檢查字符是否為十六進制數字;(0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f)
int tolower(int c):轉化字符為小寫字母;
int toupper(int c):轉化字符為大寫字母;
這些函數參數均為int類型,事實上僅能傳遞EOF或者unsigned char類型兼容的;其他值均會失敗返回0。
glibc的針對is開頭的檢查函數,均為宏,其內部使用宏__isctype或者__isctype_f宏實現;如# define isalnum(c) __isctype((c), _ISalnum);
# define __isctype(c, type) ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type);其中type參數為類型碼位;其內部提供了12種碼位,分別占用一個位,
目前可用unsigned short int來容納這可能的12種類型的標識掩碼(由_ISbit宏偏移碼位表示);這樣不同的字符可能有多個碼位標識,如A,即滿足isalpha字母,isprint字母等;
__ctype_b_loc函數為其自己實現的,主要獲取一個數組列表,可容納-128~255范圍的字符,對應字符值索引可獲取到本地語言的字符集,對於要求的字符與掩碼位求與即可得到該
字符是否為某種掩碼位類型的字符;glibc除了提供__ctype_b_loc外,還有__ctype_tolower_loc、__ctype_toupper_loc后兩者針對轉化字符用的數組列表。
可以推測此幾個表*_loc,內部直接將對應的字符值作為數組的索引獲取到該字符對應的掩碼位組合值;
glibc的轉化字符函數:tolower、toupper其實現分別為return c >= -128 && c < 256 ? __ctype_tolower[c] : c、c >= -128 && c < 256 ? __ctype_toupper[c] : c;
glibc除了提供基本的檢查函數和轉化函數外,還提供了一些擴展函數,如toascii、isascii、_tolower、_toupper等;
微軟的提供的實現基本類型,也是提供了幾個表如_wctype、__newctype、__newclmap、__newcumap,其中_wctype表提供掩碼位組合值;另外微軟也提供了更多的其他擴展函數,
以及針對寬字符的支持。