string对象中字符的处理

我们经常要对 string 对象中的单个字符进行处理,例如,通常需要知道某个特殊字符是否为空白字符、字母或数字。表 3-3 列出了 各种字符操作函数,适用于 string 对象的字符(或其他任何 char 值)。这些函数都在 cctype 头文件 中定义。

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!!!

和返回真值的函数不同的是,tolowertoupper函数返回的是字符,返回实参字符本身或返回该字符相应的大小写字符。我们可以用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而在头文件名前加了cc表示这个头文件源自C标准库。因此,cctypectype.h文件的内容是一样的,只是采用了更适合C++程序的形式。特别地,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。

通常,C++程序中应采用cname这种头文件的版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。使用.h版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承来的,而哪些是C++所特有的。

 

你可能感兴趣的:(string对象中字符的处理)