一:基本使用
--1 string定义和初始化
string s1; //调用默认构造函数,初始化为空
string s1(s2);
string s1("hello");
string s1(n,'a'); //n个a
--2 string读写
cin>>s1;
getline(cin,s1);
--3 string对象操作
s1.empty() //判断是否为空,为空则返回ture,反之返回false
s1.size() //获取字符串大小
s1[n] //下表操作,标识每一位的值,n(0,s1.size()-1),返回size_type类型,定义同无符号整型,
//下标可作为左值对其进行赋值,不可越界,空字符串不能取值
s1+s2 //字符串连接
s1=s2 //s2赋值给s1
s1==s2 //比较字符串是否相等,相等返回ture !=,<=,<.>,>=
//比较,同长度比较第一个不同的字符,不同长度,短的和长的前面都相同,长的大
--4 string中字符的处理
//cctype头文件中定义函数
isalnum(c) //字母或字符,返回ture
isalpha(c) //字母返回ture
isdigit(c) //数字
isxdigit(c)//十六进制
islower(c) //小写字母
isupper(c) //大写字母
tolower(c) //转为小写,已是小写不处理,返回c
toupper(c) //转为大写
isprint(c) //可打印字符
ispunct(c) //标点符号
isspace(c) //空白字符
isgraph(c) //不是空格,但可打印
iscntrl(c) //控制字符返回ture
--5 练习
----1)string读写
void _string()
{
cout<<"---_string"<<endl;
string s1;
cout<<"---prac1-请输入!!"<<endl;
while(cin>>s1)
cout<<"s1="<<s1<<endl;
//输入( hello world );返回
//s1=hello
//s1=world
//说明:忽略所有开头的空格,一个字符串以空格结束;要想结束输入,windows用ctrl+z;unix一般用ctrl+d
cout<<"---prac2-请输入!!"<<endl;
while(getline(cin,s1))
cout<<"s1="<<s1<<endl;
//输入( hello world );返回 ( hello world ),,在输入(hi),返回s1=hi,空格也会输出
//遇到换行输入下一行,结束方式同prac1
}
----2)对象操作
void _string()
{
//---prac3:读入两个字符串,判断是否相等,不相等则输出大的一个
cout<<"--请输入两个数!!"<<endl;
string s1,s2;
cin>>s1>>s2;
if(s1==s2)
{
cout<<"相等"<<endl;
}
else
{
cout<<"大的那个是" << (s1>s2?s1:s2)<<endl;
}
//--prac4:读入多个,全部输出,相邻的以空格分开
string s3,s4;
while(cin>>s3)
{
s4+=" " + s3;
}
cout<<"所有输入的字符串为"<<s4<<endl;
//--prac5:去掉string中的标点
string s5,s6;
while(getline(cin,s5))
{
if(!s5.empty())
{
for(int i=0;i!=s5.size();i++)
{
if(ispunct(s5[i])) ;
else s6+=s5[i];
}
}
cout<<"去标点后的值为"<<s6<<endl;
}
//输入 hello,world!!,返回helloworld,在输入hi!!,返回helloworldhi
//--prac6:去掉字符串中的me,扩展去掉任意字符串
string s7="my name is melly!!",s8;
for(int i=0;i!=s7.size();i++)
{
if(s7[i]=='m'&&s7[i+1]=='e') i++;
else s8+=s7[i];
}
cout<<"my name is melly!! 去除 me后是"<<s8<<endl;
//my na is lly!!
}
二:扩展使用
--1 string支持的容器操作
----1)构造函数,使用迭代器标示范围内的副本
c(b,e);
举例:
string s10("hello world");
string::iterator iter1=s10.begin();
string s11(s10.begin(),s10.end());
string s12(iter1,iter1+s10.size());
cout<<s11<<endl;
cout<<s12<<endl;
----2)容器定义的类型别名
size_type //无符号整型,一般用来存储容器的长度
difference_type //存储两个迭代器迭代器的差值,可为负数
iterator //容器的迭代器类型
const_iterator //元素只读迭代器类型
reverse_iterator //按逆序寻址的元素迭代器类型
const_reverse_iterator
value_type //元素类型-
reference //元素的左值类型
const_reference //元素的常量左值类型
----3)begin,end,rbegin,rend成员
string s10("hello world");
string::reverse_iterator iter2=s10.rbegin();
string s13(s10.rbegin(),s10.rend());
string s14(iter2,iter2+s10.size());
cout<<s13<<endl; //dlrod olleh
cout<<s14<<endl;
---4)添加元素操作
c.push_back(t) //最后位插入t元素
c.insert(p,t) //p位置插入t元素
c.insert(p,n,t) //p位置插入n个t
c.insert(p,b,e) //p位置插入迭代器b到e标识的范围
举例:
s10.push_back('!!');
cout<<s10<<endl; //hello world! ,注意只有一个!,插入的是字符元素,输入多个也会截断
s10.insert(s10.begin(),2,'i');
cout<<s10<<endl; //iihello world!
----5)容器大小操作
c.max_size() //容器最大可容纳的个数
c.resize(n) //调整容器的长度,使得能容纳n个
c.resize(n,t) //调整容器的长度,n位都为t元素
举例:
string s10("hello world");
cout<<s10.max_size()<<endl; //1073741820
s10.resize(2); //初始化当前容纳的数,不改变max_size()
cout<<s10.max_size()<<endl; //1073741820
cout<<s10<<endl; //he
s10.push_back('!'); //he!
cout<<s10<<endl;
----6)访问容器内元素的操作
c.at(n) //返回下表n的元素的引用,不能越界
cout<<s10.at(0)<<endl; //h
----7)删除元素操作
c.erase(p) //删除迭代器p所指向的元素
c.erase(b,e) //删除b,e区间的元素
c.clear() //全部删除
举例:
s10="hello,world";
s10.erase(s10.begin());
cout<<s10<<endl; //ello,world
s10.erase(s10.begin(),s10.begin()+2);
cout<<s10<<endl; //lo,world ,做闭合又不闭合,只删除2位
s10.clear();
cout<<s10<<endl; //空
----8)赋值与swap操作
s1.swap(s2) //s1和s2的值交换
s1.assign(b,e) //重新赋值,迭代器b到e范围间的值
s1.assign(n,t) //重新赋值,n个t
//不同容器(或相同)类型的容器内,元素类型不相同但是互相兼容,就要用assign,不用=号赋值
----9)capacity和reserve成员 (待
)
--2 构造string对象的其他方法
----1)使用指针参数的构造,该指针指向以空字符结束的字符数组
举例:
char *cp="hiptr";
char c_array[]="hiarray";
char no_null[]={'h','i'};
char have_null[]={'h','i','\0'};
string s16(cp);
cout<<s16<<endl;
s16=c_array;
cout<<s16<<endl;
s16=no_null; //正常运行,打印erro,没结束符
cout<<s16<<endl;
s16=have_null;
cout<<s16<<endl;
----2)使用指针和计数器,注意n,pos,len都是unsigned值
string s(cp,n) //指针cp指向数组的前n个
string s(s1,pos) //字符串s1.从pos位置到最后,pos不能大于s1.size()
string s(s1,pos,len) //字符串s1.从pos位置起len个,len若指定太大只能赋值到s1从pos到最后一位
举例:
char no_null[]={'h','i','!'};
string s17(no_null,3);
cout<<s17<<endl; //正确,打印hi!
string s18(s17,0);
cout<<s18<<endl; //打印,hi!
string s19(s17,0,1);
cout<<s19<<endl; //打印,hi
char *p9="hi";
string s9="hello";
const char *p10=s9.c_str(); //需要c_str转换,转换为const char*类型
cout<<"s9="<<s9<<endl;
cout<<sizeof(s9.c_str())<<endl; //4,类型为const char*,32位上指针都为4个字节
cout<<sizeof(s9[0])<<endl; //1,类型我字符类型,1个字节
--3 修改string对象的其他方法
//说明,pos指当前字符串s的位置,n,len为长度,c为元素,cp为指向以null结束的字符串副本
s.insert(pos,n,c) //插入n个c元素,从字符串s的pos位置起
s.insert(pos,s1)
s.insert(pos,s1,pos,len)
s.insert(pos,cp,len)
s.insert(pos,cp)
s.assign(s1) //用s1代替s
s.assign(s1,pos,len)
s.assign(cp,len)
s.assign(cp)
s.erase(pos,len)
举例:
char *cp="hiptr";
string s20("hello,test");
string s21("!?");
s20.insert(0,2,'a');
cout<<s20<<endl; //aahello,test
s20.insert(s20.size(),s21,0,1);
cout<<s20<<endl; //aahello,test!
s20.insert(s20.size(),cp);
cout<<s20<<endl; //aahello,test!hiptr
--4 只适用于string类型的操作
----1)substr,说明pos为s的位置
s.substr(pos,n) //返回,从pos起,n个
s.substr(pos)
s.substr() //返回,s
举例:
s20.assign("hello");
cout<<s20.substr(0)<<endl; //hello
cout<<s20.substr(1,4)<<endl; //ello
cout<<s20.substr()<<endl; //hello
----2)append/replace
args参数可替换为:
s1,s1 pos len,cp,cp len,n c,b e
s.append(args); //追加
s.replace(pos,len,args) //替换,args不能为b e
s.replace(b,e,args) //替换,args只能为n c,b e
举例:
s20.assign("hello");
cout<<s20.append("??")<<endl; //hello??
cout<<s20.replace(0,2,s21,0,1)<<endl; //!llo??替换的没个个数没要要替换的长,亦可
--5 string类型的查找操作
args参数可替换为,c pos,s pos,cp pos,cp pos n,返回size_type,没有则返回npos
s.find(args) //返回第一次查到位置
s.rfind(args) //最后一次出现
s.find_first_of(args) //第一个在args中任何出现的字符的位置
s.find_first_no_of(args) //第一个不属于args的字符位置
s.find_last_of(args)
s.find_first_no_of(args)
例如:
s20.assign("hello hllo");
cout<<s20.find("he",0)<<endl; //0
cout<<s20.find("el",2)<<endl; //米有
cout<<s20.find_first_of("lh",0)<<endl; //0
cout<<"firstof"<<s20.find_first_of(" t",0)<<endl; //5,空格也算
--6 string对象的比较
//说明,s1>s2,返回值>0,反之<0,相等则==0;注意s2要是指定位置,则长度不可缺少
s1.compare(s2)
s1.compare(pos,len,s2)
s1.compare(pos,len,s2,pos,len)
s1.compare(cp)
s1.compare(pos,len,cp)
s1.compare(pos,len,cp,n)
举例:
s20.assign("hello");
string s22("hi hey");
cout<<s20.compare(0,2,s22,3,2)<<endl; //0
--7 练习
----1)从某字符串中去掉任意一个字符串,如从字符串abcdetfghetijk中去掉et
int flag=0,i=0;
while(flag!=1)
{
cout<<"--in"<<endl;
if(!s24.empty() && s23.find(s24)!=string::npos) s23.erase(s23.find(s24),s24.size());
else flag=1;
}
if(i==0) cout<<s23<<"中没有"<<s24<<endl;
else cout<<"去了et处理后abcdetfghetijk等于"<<s23<<endl; //abcdfghijk
//要进行s24.empty()判断,否会进入死循环;
----2)从某字符串中找到某字符,并用另一个字符替换;如找到hi用hello替换
int flag=0,i=0;
while(flag!=1)
{
cout<<"--in"<<endl;
cout<<s24.empty()<<endl;
if(!s24.empty()&&s23.find(s24)!=string::npos)
{
s23.replace(s23.find(s24),s24.size(),"qq");
i++;
}
else flag=1;
}
if(i==0) cout<<s23<<"中没有"<<s24<<endl;
else cout<<"abcdetfghetijk中et用qq代替后为"<<s23<<endl; //abcdqqfghqqijk
----3)查找字符串中所有数字字符,所有字母字符,用find_first_of 和 find_first_not_of,如a1b2c3def
string s26("abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ");
string s27("0123456789");
string s28("a1b2c3def");
string::size_type j=0,k=0,pos=0;
while((pos=s28.find_first_of(s26,pos))!=string::npos)
{
pos++;
j++;
}
pos=0;
while((pos=s28.find_first_of(s27,pos))!=string::npos)
{
pos++;
k++;
}
cout<<"字母个数为"<<j<<endl;
cout<<"数字个数为"<<k<<endl;
----4)字符串以单词为单位倒序输出,
如"i am a beautiful girl,my name is lily!",返回"lily! is name my girl, beautiful a am i"
string s30("i am a beautiful girl, my name is lily!");
string s31;
int wlen=0;
for(int i=s30.size()-1; i>=0 ; i--)
{
string temp;
if(s30[i] == ' ' || i==0)
{
temp=s30.substr(i,wlen+1);
wlen=0;
}
else wlen++;
if(i==0) s31=s31+" "+temp;
else s31=s31+temp;
}
cout<<"倒叙后i am a beautiful girl,my name is lily!为"<<s31<<endl;
// lily! is name my girl, beautiful a am i
(2011-10-26 11:17:16)