资料出处:http://blog.sina.com.cn/s/blog_525221f90100cslx.html
#include <string>
using std::string;- 初始化
string s1;
string s2(s1);
string s3("abc");
string s4(4,'c');
string s5(s3.begin(),s3.begin()+2);//容器特性
string s(cp,n) //创建一个string 对象,初始化为cp所指向数组的前n个元素的副本
string s(s2,pos2)//创建一个string 对象,初始化为s2中从pos2开始的字符副本
string s(s2,pos2,len2)创建一个string 对象,初始化为s2中从pos2开始的长为len2的字符副本
eg:
char *cp="Hiya";//ends with \0
char c_array[]="World!!!!";//ends with \0
char no_null[]={'H','i'}; //no \0 terminated
string s(cp);
string s2(c_array,5);
string s3(c_array+5,4);
string s4(no_null);//error
string s5(no_null,2);//ok
- 修改string对象的操作
与容器共有的string操作:
s.insert(p,t)//返回新插入元素的迭代器
s.insert(p,n,t)
s.insert(p,b,e)//返回void
s.assign(b,e)//返回s,对于容器返回void
s.assign(n,t)//返回s,对于容器返回void
s.erase(p)
s.erase(b,e)
string类型特有的容器操作函数版本:
s.insert(pos,n,c)
s.insert(pos,s2)
s.insert(pos,s2,pos2,len)
s.insert(pos,cp,len)
s.insert(pos,cp)
s.assign(s2)
s.assign(s2,pos2,len)
s.assign(cp,len)
s.assign(cp)
s.erase(pos,len)
只适用于string类型的操作:
s.substr(pos,n)
s.substr(pos)
s.substr()//返回s 的副本
s.append(args)
s.replace(pos,len,args)
s.replace(b,e,args)//删除迭代器b和e间的字符,用args替换
- string类型的查找操作
string类提供了6种查找函数,全部返回string::siz_type类型值,以下形式返回所发生位置,或返回一个string::npos的特殊值,说明没有查找成功。string类将npos定义为保证大于任何有效下标的值。
s.find(args)
s.rfind(args)//在s中查找最后一次出现
s.find_first_of(args)//在s中查找args任意字符的第一次出现
s.find_last_of(args)//在s中查找args任意字符的最后一次出现
s.find_first_not_of(args)//s中查找第一个不属于args内的字符
s.find_last_not_of(args)//s中查找最后一个不属于args内的字符
每种查找操作都有4个重载版本,每个版本使用不同的参数集合:
c,pos在s中,从下标pos 标记的位置开始,查找字符c,pos默认值是0
s2,pos在s中,从下标pos标记的位置开始,查找s2
cp,pos在s中,从下标pos标记的位置开始,查找cp所指向的C风格的以空字符结束的字符串
cp,pos,n在s中,从下标pos标记的位置开始,查找cp所指向的数组的前n个字符 - string对象的比较
可以使用关系操作符来比较字符串:==,!=,<=,<,>=,>
compare函数:类似于C语言中的库函数:strcmp
s.compare(s2)
s.compare(pos1,n1,s2)//让s中从pos1下标位置开始的n1个字符与S2做比较
s.compare(pos1,n1,s2,pos2,n2)//让s中从pos1下标开始的n1个字符与s2中从pos2下标开始的n2个字符比较
s.compare(cp)//比较s和cp指向的以空字符串结束的字符串
s.compare(pos1,n1,cp)
s.compare(pos1,n1,cp,n2)
compare返回三种值:正数(s>args),负数(s<args),0(s==args) - 使用string::size_type来存储s.size()安全。
无法将两个字面值相加:string s="abc"+"";//error C2110: cannot add two pointers - 可以通过下标(string::size_type)来访问单个字符,并可用作左值:
string s("abc");
cout<<s[0];
s[0]='*';
可以计算下标值:s[i+j]='%'; - 在cctype头文件(位于c标准库中)中定义了多个可以用来检查类别,操作string中字符的函数。
- string类型的输入操作符和getline函数分别对空白字符的处理:
string类型的输入操作符:读取并忽略有效字符(非空白字符)之前的所有空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。
getline函数:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)。 - 和C风格字符串区别
C风格字符串字义:以空字符null结尾的字符数组。
char ca1[]={'c','+','+'};//no null,not C-style string
char ca2[]={'c','+','+','\0'};//explicit null,-style
char ca3[]="C++";//null terminator added auto, C-style
const char *cp="C++";//null terminator added auto ,C-style
char *cp=ca1;//not C-style
char *cp2=ca2;//C-style
C++通过(const)char*来操纵C风格字符串。
const char *cp="some value";
while(*cp)
{//do sth.to *cp
++cp;}
c风格的字符串的比较应该用strcmp() 来进行比较,而string标准库里的字符串重载了运算符。
c风格的字符串是通过空字符值定义的(即'\0'结尾),所以不由其所在的数组长度定义,因此不同长度的数组字符串也可能相同.
在实际应用中,应尽可能使用标准库的string。以下两段代码反映了使用C-style和C++的标准库类型string的不同之处,使用string的版本更短,更容易理解,而且出错可能性更小:
//C-style
const char *pc="a very long literal string";
const size_t len=strlen(pc);//space to allocate
//performance test on string allocatioin and copy
for(size_t ix=0;ix!=10000000;++ix)
{char *pc2=new char [len+1];//allocate the space
strcpy(pc2,pc);//do the copy
if(strcmp(pc2,pc))
{;//do sth
}
delete [] pc2;//free the memory
}
#include<string>
//string implementation
string str("a very long literal string");
//performance test on string allocation and copy
for(int ix1=0;ix1!=10000000;++ix1){
string str2=str;//do the copy,automatically allocated
if(str!=str2)
{;}//do sth.
}//str2 is auto freed
新旧代码兼容
可以使用C风格字符串对string对象进行初始化或赋值;
string类型的加法操作需要两个操作数,可以使用C风格的字符串作为其中一个操作数,也允许将C风格字符串用作复合赋值操作的右操作数,反之不成立:在要求C风格的字符串的地方不可直接使用标准库string类型对象,如:
string st2("hello");
char *str=st2;//compile-error
但是,string类提供了一个名为c_str的成员函数,以实现这个功能:
const char *str=st2.c_str();//OK
- string 操作函数(#include <ctype.h>或#include<cctype>)
- ispunct(int ch)//测试字符是否为标点符号或特殊符号。
参见:http://baike.baidu.com/view/2213685.htm - isspace(int ch)//检查参数c是否为空格字符,也就是判断是否为空格('')、定位字符
('\t')、CR('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况。
参见:http://baike.baidu.com/view/1911873.htm - isdigit(int ch)//判断字符c是否为数字。
参见:http://baike.baidu.com/view/1275773.htm
- ispunct(int ch)//测试字符是否为标点符号或特殊符号。