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前端基础知识-(五)jQuery

    通过之前的学习我们已经了解了html.css.javascript的相关知识:本次我们就共同学习进阶知识:jQuery~ 一.什么是jQuery? jQuery其实就是一个轻量级的javascript ...

  2. 首次接触nodejs

    嗯,2017年第一次接触nodejs ,也费了一些时间才终于将hello world正确运行出来. 下面说一下我的详情吧: 第一步:不用说,在https://nodejs.org/en/下载一款新的稳 ...

  3. websocket

    websocket是一个协议,在单个TCP连接上提供全双工通信.  websocket被设计并被实现在 web浏览器和 web 服务器上,但是它可以被用于任何c/s 架构的应用程序中. websock ...

  4. git rebase

    git rebase -i HEAD~[number_of_commits] git rebase -i HEAD~2

  5. [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!

    引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点: ...

  6. 用R做逻辑回归之汽车贷款违约模型

    数据说明 本数据是一份汽车贷款违约数据 application_id    申请者ID account_number 账户号 bad_ind            是否违约 vehicle_year  ...

  7. 【IOS】模仿windowsphone列表索引控件YFMetroListBox

    有没有觉得UITableView自带的右侧索引很难用,我一直觉得WindowsPhone中的列表索引非常好用. 所以呢,我们来实现类似Windows Phone中的列表索引(这就是信仰). 最终实现效 ...

  8. c/c++ long long 和__64int区别

    在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说,64位整型的定义方式有long long和__int64两种(VC还 ...

  9. 电子线路 PCB 中大电流 接口 和 布线问题;

    问题1:电流 大小 和 PCB 中 布线线宽的 关系,电源和信号 稳定性? 问题2:大电流中 接口问题,如microUSB 充电接口中,2A等 快充时接口 会 发热,如果 接口的 布线 太细和 不妥善 ...

  10. Android 系统工具类SystemUtils

    包含的功能有: 获取系统中所有APP应用.获取用户安装的APP应用.根据包名和Activity启动类查询应用信息.跳转到WIFI设置.WIFI网络开关.移动网络开关.GPS开关 当前若关则打开 当前若 ...