字符处理从C语言发展的早期开始就非常重要。要知道,C程序趋向于短小而且单一功能的编写。我们用的最多的执行字符集当然是ASCII(American Standard Code for Information Interchange),这是使用非常广泛的字符编码,但不是所有计算机体系结构都是用它。比如IMB就用EBCDIC而不是ASCII。
在我们日常编写代码的时候可能会非常频繁地使用字符判断函数,如果自己写的话,又比较麻烦,而且说实话效率和安全性都不太高。经过多年的积累,C标准库纳入了关于字符处理、判断的头文件ctype.h。一个典型的文本处理程序对输入流中的每个字符会平均调用ctype.h里的函数3次。如果用函数来实现的话,对于如此频繁的调用,开销是非常巨大的。所以一些值得称赞的程序员开发了宏来替代这些函数。说道ctype.h里的宏就不得不说到几个典型的转换表的宏集合。转换表和字符类型建立起对应的映射关系。这是典型的用空间换时间的做法,把标准的字符集合先行存入一个静态转换表中,节省了时间。但是要注意,这只适用于字符集合元素不是太多的情况。比如ASCII用7位或者8位表示一个字符类型。这样的话,字符集合元素最多也才256个。但是有的甚至用32位表示字符类型,这样的话,字符集合元素最多可以有65536个。这个要是用转换表的就有点难受了。
关于ctype.h头文件:
#ifndef MY_CTYPE_H /**保护宏*/
#define MY_CTYPE_H
#define _XA 0x200 /**额外的字母, 0x200 == 2^9*/
#define _XS 0x100 /**额外的空格, 0x100 == 2^8*/
#define _BB 0x80 /**警报符BEL, 退格符BS, etc., 0x80 == 2^7*/
#define _CN 0x40 /**5个运动控制字符CR,FF,HT,NL,NT, x040 == 2^6*/
#define _DI 0x20 /**十进制字符'0'-'9', 0x20 == 2^5*/
#define _LO 0x10 /**小写字母字符'a'-'z', 0x10 == 2^4*/
#define _PU 0x08 /**标点字符, 0x08 == 2^3*/
#define _SP 0x04 /**空格, 0x04 == 2^2*/
#define _UP 0x02 /**大写字母'A'-'Z', 0x02 == 2^1*/
#define _XD 0x01 /**十六进制字符, 0x02 == 2^0*/
/**函数声明*/
int isalnum(int), isalpha(int), iscntrl(int), isdigit(int);