C 标准库系列之ctype.h

时间:2021-08-12 13:34:55

  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表提供掩码位组合值;另外微软也提供了更多的其他扩展函数,
以及针对宽字符的支持。