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

C 标准库系列之ctype.h的更多相关文章

  1. 《C标准库》——之<ctype.h>

    在没读<ctype.h>的源码之前,我一直以为我们平时用的isalnum.isdigit.isalpha等这些函数,是靠判断写出来的. 比如: int isdigit(int c){ re ...

  2. C 标准库系列之locale.h

    locale.h 区域设置相关,主要针对时间日期.货币格式.字符控制.数字格式等以满足某区域的设置需要. locale设置类别主要包括以下几个宏定义的类别: LC_ALL:设置所有的类别: LC_CO ...

  3. C 标准库系列之errno.h

    errno.h 提供了一个整数全局变量errno,当系统调用或者库函数的错误事件发生时可能会修改该值,指明错误的原因,该值可在任何需要的地方被修改:一般情况不为0的值表示出现了异常或者错误. errn ...

  4. C 标准库系列之assert.h

    先简单介绍一下<assert.h>头文件,该头文件的目的便是提供一个宏assert的定义,即可以在程序必要的地方使用其进行断言处理:断言在程序中的作用是当在调试模式下时,若程序给出的前提条 ...

  5. C 标准库系列之limits.h

    limits.h 类似于float.h,其定义了一些列类型的值的范围.限制值,也就是说该类型的值不可以大于该上界或者小于该类型值的下界: glibc中宏定义了一下的值: # define MB_LEN ...

  6. C 标准库系列之float.h

    float.h 内部主要包含了一系列的浮点数宏.指明可移植程序必要的常量:浮点数格式一般为Spxbe;其中S表示+-:p表示底数.b表示基数如2.8.10.16等进制,e为指数标识E或e: 在一般情况 ...

  7. C 标准库系列之概述

    基本上很多编程语言都会提供针对语言本身的一系列的标准库或者包,当然C语言同样也有提供标准库,C语言的标准库是一系列的头文件的集合:如assert.h.ctype.h.errno.h.float.h.l ...

  8. 《C标准库》——之<stddef.h>

    <stddef.h>,顾名思义,就是标准定义.C语言里这个标准库里定义了一些类型,和宏定义. <stddef.h>的内容: 类型: ptrdiff_t : 是两个指针相减的结果 ...

  9. 《C标准库》—之<assert.h>实现

    首先,贴出标准库中<assert.h>的实现源码: #undef assert #ifdef NDEBUG #define assert(test)((void)0) #else void ...

随机推荐

  1. 移动端Web开发调试之Chrome远程调试(Remote Debugging)

    比如手机钉钉调试页面,下面是一位同学整理的链接: http://blog.csdn.net/freshlover/article/details/42528643/ 如果inspect 后,一直空白, ...

  2. 苹果iphone手机上input的button按钮颜色显示有问题,安卓却没问题

    苹果手机中会如类似上图,安卓却可以按自己写的来显示 解决办法: -webkit-appearance: none; 以上即可,当然样式中可以加上通用的: 通用:input[type=button], ...

  3. springmvc @responsebody 406/415问题解决

    提供几个解决思路 1.如果项目中用的spring jar包是4.x版本, 需要jackson-annotations-2.x/jackson-core-2.x/jackson-databind-2.x ...

  4. 保留password模式文本框textbox内的数据不丢失。

    在asp.net 2.0环境下,使用textbox,提交到服务器再传回,如果textbox是password模式的,那么textbox内的密码(星号),就没有了! protected override ...

  5. Comet技术

    1.Comet是什么? 维基百科: Comet是一种用于web的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 说白了就是web ...

  6. sessionState详解

    asp.net Session的默认时间设置是20分钟,即超过20分钟后,服务器会自动放弃Session信息. 当我们在asp.net程序中打开web.config的时候,可以看到一段如下的代码: A ...

  7. Maven的Missing artifact问题解决

     Maven的Missing artifact问题解决   今天在创建一个新的Maven项目时,在其中添加了很多依赖.刚开始为了避免错误就每添加一次,保存一下,Eclipse就会下载相应的包.最后为了 ...

  8. git用法之常用命令[克隆、提交]

    1.克隆/下载项目 1)git clone git@git.soydai.cn:liuxuewen/static-file-3.0.git 或者 2)git clone http://git.soyd ...

  9. HashMap和 Hashtable的比较

    Hashtable 和 HashMap的比较 1.  HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...

  10. 3篇NeuroImage文献分析

    鉴于之前读的一些文章很容易就忘掉了,故打算花点时间记录下所读的文献. 这几天花了一些时间读了3篇文献: Intersubject consistency of cortical MEG signals ...