表3-3 cctype定义的函数
isalnum(c) |
如果c是字母或数字,则为true。 |
isalpha(c) |
如果c是字母,则为true。 |
iscntrl(c) |
如果c是控制字符,则为true。 |
isdigit(c) |
如果c是数字,则为true。 |
isgraph(c) |
如果c不是空格,但可输出,则为true。 |
islower(c) |
如果c是小写字母,则为true。 |
isprint(c) |
如果c是可输出的字符,则为true。 |
ispunct(c) |
如果c是标点符号,则为true。 |
isspace(c) |
如果c是空白字符,则为true。 |
isupper(c) |
如果c是大写字母,则为true。 |
isxdigit(c) |
如果c是十六进制数,则为true。 |
tolower(c) |
如果c是大写字母,则返回其小写字母形式,否则直接返回c。 |
toupper(c) |
如果c是小写字母,则返回其大写字母形式,否则直接返回c。 |
表3-3中的大部分函数是测试一个给定的字符是否符合条件,并返回一个int值作为真值。如果测试失败,则该函数返回0,否则返回一个(无意义的)非0值,表示被测字符符合条件。
表中的这些函数,可输出的字符是指那些可以显式表示的字符。空白字符则是空格、制表符、垂直制表符、回车符、换行符和进纸符中的任意一种;标点符号则是除了数字、字母或(可输出的)空白字符(如空格)以外的其他字符。
这里给出一个例子,运用这些函数输出一给定string对象中标点符号的个数:
string s("Hello World!!!");
string::size_type punct_cnt = 0;
// count number of punctuation characters in s
for (string::size_type index = 0; index != s.size(); ++index)
if (ispunct(s[index]))
++punct_cnt;
cout << punct_cnt
<< " punctuation characters in " << s << endl;
这个程序的输出结果是:
3 punctuation characters in Hello World!!!
和返回真值的函数不同的是,tolower和toupper函数返回的是字符,返回实参字符本身或返回该字符相应的大小写字符。我们可以用tolower函数把string对象s中的字母改为小写字母,程序如下:
// convert s to lowercase
for (string::size_type index = 0; index != s.size(); ++index)
s[index] = tolower(s[index]);
cout << s << endl;
得到的结果为:
hello world!!!
建议:采用C标准库头文件的C++版本
C++标准库除了定义了一些特定于C++的设施外,还包括C标准库。C++中的头文件cctype其实就是利用了C标准库函数,这些库函数就定义在C标准库的ctype.h头文件中。
C标准库头文件命名形式为name.h,而C++版本则命名为cname,少了后缀.h而在头文件名前加了c。c表示这个头文件源自C标准库。因此,cctype与ctype.h文件的内容是一样的,只是采用了更适合C++程序的形式。特别地,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。
通常,C++程序中应采用cname这种头文件的版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。使用.h版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承来的,而哪些是C++所特有的。