ctype.h

(重定向自Wctype.h

ctype.hC標準函数庫中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节字符,也支持宽字符[1]

实现

现代的C库中,字符分类函数一般不用比较测试(comparison tests)实现,而是静态查表来实现。

例如,创建一个由256个8位宽整数组成的数组,每个整数的每位对应字符的特定的分类性质,如属于数字、属于字母等等。如果最低位表示属于数字性质,那么可以写成如下代码:

#define isdigit(x) (TABLE[x] & 1)

早期版本的Linux使用了潜在犯错的方法,类似于:

#define isdigit(x) ((x) >= '0' && (x) <= '9')

这会产生问题,如宏参数x具有副作用---例如,如果调用isdigit(x++)isdigit(run_some_program()),可能不是很显然,isdigit的参数将被求值两次。所以,查表的方法被广泛使用。

函数

单字节字符处理函数在ctype.h(C++的cctype )中声明。宽字节字符处理函数在wctype.h(C++的cwctype)中声明.

单字节 宽字节 描述
isalnum iswalnum 是否为字母数字
isalpha iswalpha 是否为字母
islower iswlower 是否为小写字母
isupper iswupper 是否为大写字母
isdigit iswdigit 是否为数字
isxdigit iswxdigit 是否为16进制数字
iscntrl iswcntrl 是否为控制字符
isgraph iswgraph 是否为图形字符(例如,空格、控制字符都不是)
isspace iswspace 是否为空格字符(包括制表符、回车符、换行符等)
isblank iswblank 是否为空白字符 (C99/C++11新增)(包括水平制表符)
isprint iswprint 是否为可打印字符
ispunct iswpunct 是否为标点
tolower towlower 转换为小写
toupper towupper 转换为大写
不適用 iswctype 检查一个wchar_t是否是属于指定的分类
不適用 towctrans 使用指定的变换映射来转换一个wchar_t(实际上是大小写的转换)
不適用 wctype 返回一个宽字符的类别,用于iswctype函数
不適用 wctrans 返回一个变换映射,用于 towctrans

参考文献

  1. ^ ISO/IEC 9899:1999 specification (PDF). . p. 193, § 7.4 [2013-06-20]. (原始内容 (PDF)存档于2011-01-24). 

外部链接