我们使用字符串时经常要对字符串中单个字符进行处理,比如检测一个string对象是否包含空白,或者把string对象中的字母大写改为小写,查看某个特定字符是否出现,判断字符串是否为数字等等。
这类处理的关键是要获取字符本身。有时需要处理string对象中的每一个字符,另外一些时候则只需处理某个特定的字符,还有些时候遇到某个条件处理就要停下来。
在cctype头文件中定义了一组标准库函数处理字符串的工作。
cctype头文件中的函数
isalnum(c) 当c是字母或数字时为真
isalpha(c) 当c是字母时为真
iscntrl(c) 当c是控制字符时为真
isdigit(c) 当c是数字时为真
isgraph(c) 当c不是空格但可打印时为真
islower(c) 当c是小写字母时为真
isprint(c) 当c是可打印字符时为真(即c是空格或c具有可视形式)
ispunct(c) 当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)
isspace(c) 当c是空白时为真(即c是空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)
isupper(c) 当c是大写字母时为真
isxdigit(c) 当c是十六进制数字时为真
tolower(c) 如果c是大写字母,输出对应的小写字母,否则原样输出c
toupper(c) 如果c是小写字母,输出对应的大写字母,否则原样输出c
处理每个字符,可以使用基于范围的for语句,c++11新标准
(vs2010编译器不支持,呵呵,我用不了)
for(declaration:expression)
statement
example:
string s("hello, world");
for(auto c:s)
cout<<c<<endl;
代码:
// string.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> #include <cctype> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //初始化字符串,初始化分为直接初始化()和拷贝初始化“=” string str("HEllo, wo shi Guo jia zhu xi de ****12134556, xia wo yi tiao!!!"); string::size_type len=str.size();//长度 cout<<"字符串为:"<<str<<endl<<"字符串的长度为:"<<len<<endl; cout<<"操作1:判断是否是字母,如果是字母,则小写字母变为大写字母"<<endl <<",大写字母变为小写字母。如果是数字,执行加1操作。如果是空"<<endl <<"格,转换为双空格。计算标点符号的个数。"<<endl; //补充知识 string a="我"; cout<<"一个中文字符"<<a<<"占"<<a.size()<<"两个字节。"<<endl; /*char c;*/ char *c; int count=0; for(int i=0; i<len; i++) { //char &c=str.at(i); c=&str.at(i); if(isalpha(*c)) { if(isupper(*c)) *c=tolower(*c); else if(islower(*c)) *c=toupper(*c); } else if(isdigit(*c)) { *c=*c+1; } else if(ispunct(*c)) { ++count; } } cout<<"字符串修改后为:"<<str<<endl; cout<<"字符串中标点符号个数为:"<<count<<endl; system("pause"); return 0; }
一般有两种方法访问单一字符:下标操作符[ ]和成员函数at()。下标操作符在使用时不检查索引的有效性。超出范围的下标将引发不可预知的结果。下标操作符返回的是该位置字符的引用。at()在使用时会检查下标是否有效,超出范围会抛出。at()返回的是该位置字符的拷贝值。