补充一些细节,以及使用ctype.h里面的函数(准确的说是宏)的注意事项。
补充一点关于#error的问题,在上一节中,转换表中有写到#error
,这个东西大概是这样的:
#include <stdio.h>
//#define BENBEN
#ifndef BEBEN
#error There is no BENBEN
#else
#define QWE 123
#endif
int main()
{
printf("Hello World\n");
return 0;
}
去掉第二行的注释程序就能正常运行了,不然在编译时就会报错。并且输出There is no BENBEN(注意是编译器输出信息,不是运行生成的可执行文件,编译都没有通过怎么会有目标文件,更不会有可执行文件),并且编译完这句就不会往下继续编译,当即停止。当然你也可以不写这一句,但是就没有任何的提示信息了。
(一)字符判断函数:
以下提到的函数当且仅当参数c的值和函数描述中的一致时才返回非0(真).
#include <ctype.h>
int isalnum(int c);
注意参数的类型是int,但是这个我们可以不用太在乎,因为我们判断的是字符,signed char 和unsigned char类型提升为int是没问题的,并不会出现有效值丢失的问题。看函数的名字,顾名思义,判断是不是字母或者数字。因为这里的函数名是没有加括号的,实际上我们使用的是宏。宏表达式的值为非0,就为真,为0,就为假。注意一点,isalnum判别所有isalpha或者isdigit判别为真的字符为真。
#include <ctype.h>
int isalpha(int c);
isalpha判别所有isupper或者islower判别为真的字符为真。
#include <ctype.h>
int iscntrl(int c);
iscntrl判别所有的控制字符。
#include <ctype.h>
int isdigit(int c);
isdigit判别所有的十进制数字字符,也就是’0’ ~ ‘9’.有如下简洁地将字符串的数字字符转换成整数的代码:
for (value = 0; isdigit(*s); ++s)
value = value * 10 + (*s - '0');
不过这里并没有添加溢出检查,当字符串的数字字符足够长的时候就有可能溢出int,甚至是long long(64位整数)的范围。
#include <isgraph>
int isgraph(int c);
isgraph判别所有能显示的打印字符,也就是说判别除空格(’ ‘)之外的所有打印字符。
#include <ctype.h>
int islower(int c);
islower判别所有的小写字母。
#include <ctype.h>
int isprint(int c);
isprint判别包括空格(’ ‘)在内的所有打印字符。
#include <ctype.h>
int ispunct(int c);
ispunct判别除空格(’ ‘)和isalnum判别为真的字符之外的所有打印字符。也就是所谓的标点字符。
#include <ctype.h>
int isspace(int c);
isspace判别所有标准的空白字符,标准空白字符有:空格(’ ‘)、换页(’\f’)、换行(’\n’)、回车(’\r’)、水平制表符(’\t’)和垂直制表符(’\v’)。
#include <ctype.h>
int isupper(int c);
判别所有的大写字母。
#include <ctype.h>
int isxdigit(int c);
isxdigit判别所有十六进制数字的字符。类似的可以像十进制数字字符那样转换:
#include <ctype.h>
#include <string.h>
static const char xd[] =
{"0123456789ABCDEFabcdef"};
static const char xv[] =
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15,
10, 11, 12, 13, 14, 15};
for (value = 0; isxdigit(*s); ++s)
value = (value << 4) + xv[strchr(xd, *s) - xd];
这里利用了映射关系,知道字符在xd数组的位置就知道它的值。注意value << 4,表示右移4位,也就是乘16.strchr(xd, *s)返回*s在xd中的位置(返回的是一个指针)。
(二)字符大小写转换函数:
#include <ctype.h>
int tolower(int c);
把一个大写字母转换为小写字母。如果c不是大写字母,那么返回c的原来值。
#include <ctype.h>
int toupper(int c);
把一个小写字母转换为大写字母。如果c不是小写字母,那么就返回c的原来值。