3.2.4 string对象中字符的处理
我们经常要对string对象中的单个字符进行处理,例如,通常需要知道某个特殊字符是否为空白字符、字母或数字。表3-3列出了各种字符操作函数,适用于string对象的字符(或其他任何char值)。这些函数都在cctype头文件中定义。
表3-3 cctype定义的函数
表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; |
得到的结果为:
建议:采用C标准库头文件的C++(www.cppentry.com)版本
C++(www.cppentry.com)标准库除了定义了一些特定于C++(www.cppentry.com)的设施外,还包括C标准库。C++(www.cppentry.com)中的头文件cctype其实就是利用了C标准库函数,这些库函数就定义在C标准库的ctype.h头文件中。
C标准库头文件命名形式为name.h,而C++(www.cppentry.com)版本则命名为cname,少了后缀.h而在头文件名前加了c。c表示这个头文件源自C标准库。因此,cctype与ctype.h文件的内容是一样的,只是采用了更适合C++(www.cppentry.com)程序的形式。特别地,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。
通常,C++(www.cppentry.com)程序中应采用cname这种头文件的版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。使用.h版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承来的,而哪些是C++(www.cppentry.com)所特有的。
习题
习题3.7 编一程序读入两个string对象,测试它们是否相等。若不相等,则指出两个中哪个较大。接着,改写程序测试它们的长度是否相等,若不相等指出哪个较长。
习题3.8 编一程序,从标准输入读取多个string对象,把它们连接起来存放到一个更大的string对象中。并输出连接后的string对象。接着,改写程序,将连接后相邻string对象以空格隔开。
习题3.9 下列程序实现什么功能?实现合法吗?如果不合法,说明理由。
string s; cout << s[0] << endl; |
习题3.10 编一程序,从string对象中去掉标点符号。要求输入到程序的字符串必须含有标点符号,输出结果则是去掉标点符号后的string对象。
【责任编辑:
董书 TEL:(010)68476606】