string作为一个类出现,它集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要,我们可以用=进行赋值操作,==进行比较,+做连接。可以把他看成c++基本数据类型。
1.头文件#include<string>
2声明一个c++字符串:string str;
string类的构造函数和析构函数如下:
(a)string s;生成一个空字符串
(b)string s(str)拷贝构造函数,生成str的复制品
(c)string s(str,stridx)将字符串str内始于位置stridxde部分当做字符串初值
(d)string s(str,stridx,strlen)将str始于stridx且长度顶多为strlen的部分当做字符串初值
(e)string s(cstr)将c字符串作为s的初值
(f)string s(chars,chars_len)将c串前chars_len个字符作为s初值
(g)string s(num,c)生成包含num个c字符串
(h)string s(beg,end)以区间beg,end(不包含end)内字符作为s初值
(i)s.~string()销毁所有字符,释放内存
3.字符串操作函数
(a)=,assign()赋值
(b)swap()交换两个串的内容
(c)+=,append(),push_back()在尾部添加字符
(d)insert()插入字符
(e)erase()删除字符
(f)clear()删除全部字符
(g)replace()替换字符
(h)+串联字符
(i)==,!=,<,<=,>,>=,compare()比较字符串
(j)size(),length()返回字符数量
(k)max_size()返回字符可能的最大个数
(l)empty()判断串是否为空
(m)capacity()返回重新分配之前的字符容量
(n)reserve()保留一定量内存容量一定数量的字符
(o)[ ],at()存取单一字符
(p)>>,getline()从stream读取某值
(q)<< 将某值写入stream
(r)copy()将某值赋值为一个c_string
(s)c_str() 将内容以c_string返回
(t)data() 将内容以字符数组形式返回
(u)substr()返回某个子字符串
(v)find()查找函数
(w)begin(),end()提供类似stl迭代器支持
(x)rbegin(),rend()逆向迭代器
(y)get_allocator()返回配置器
4.c++字符串和c字符串转换
c++串转c串的方法是:data(),c_str(),copy(),其中,data()以字符数组形式返回字符串内容,不添加'\0'。c_str()返回一个以‘\0’结尾的字符数组。copy()把字符串内容复制到已有的c_string或字符数组内。
5.大小和容量函数
(a)现有的字符数:size()和length()。empty()用来检查串是否为空。
(b)max_size()这个大小是指当前c++串最多包含的字符数,和机器有关,我们不用关心。
(c)capacity()重新分配之前string所包含的最大字符数。这里需要另一个函数reserve(),为string重新分配内存。大小由其参数决定,默认0,这会对string进行非强制性缩减。
6.元素存取
[ ],at()(0~s.length()-1)
string str(“string”)
str[3];str.at(3);
7.比较函数
(>,>=,<,<=,==,!=)
另一个功能强大比较函数compare(),返回一个整数表示比较结果,0:相等;>0: 大于;<0:小于。
string s(“abcd”);
s.compare(“abcd”)返回0
s.compare(“dbca”)返回>0值
s.compare(“ab”)返回<0值
s.compare(0,2,s,2,2);用ab和cd进行比较
8.改变内容
首先:赋值
=:
s=ns,s=“gaint”,s=‘j’。
assign():
s.assign(str);
s.assign(str,1,3);
s.assign(str,2,string::npos)把字符串str从索引值2到结尾赋给s
s.assign(“gaint”);
s.assign(“nico”,5);
s.assign(5,‘x’)把5个x赋给s。
把字符串清空方法:s="";s.clear();s.erase()。
string提供很多函数:插入(insert),删除(erase),替换(replace),增加字符(+=,append(),push_back())。
s+=str;
s+="my ";
s+='a';
s.append(str);
s.append(str,1,3);
s.append(str,2,string::npos);
s.append("my");
s.append("nico",5);
s.append(5,'x');
下面我们首先从一些示例开始学习下string类的使用.
1)
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s("hehe");
cout<<s<<endl;
cin.get();
}
2)
#include <string>
#include <iostream>
using namespace std;
void main()
{
char chs[] = "hehe";
string s(chs);
cout<<s<<endl;
cin.get();
}
3)
#include <string>
#include <iostream>
using namespace std;
void main()
{
char chs[] = "hehe";
string s(chs,1,3); //指定从chs的索引1开始,最后复制3个字节
cout<<s<<endl;
cin.get();
}
4)
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s1("hehe");
string s2(s1);
cout<<s2<<endl;
cin.get();
}
5)
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s1("hehe",2,3);
string s2(s1);
cout<<s2<<endl;
cin.get();
}
6)
#include <string>
#include <iostream>
using namespace std;
void main()
{
char chs[] = "hehe";
string s(chs,3); //将chs前3个字符作为初值构造
cout<<s<<endl;
cin.get();
}
7)
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s(10,'k'); //分配10个字符,初值都是'k'
cout<<s<<endl;
cin.get();
}
//以上是string类实例的构造手段,都很简单.
9)
//赋新值
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s(10,'k'); //分配10个字符,初值都是'k'
cout<<s<<endl;
s = "hehehehe";
cout<<s<<endl;
s.assign("kdje");
cout<<s<<endl;
s.assign("fkdhfkdfd",5); //重新分配指定字符串的前5的元素内容
cout<<s<<endl;
cin.get();
}
10)
//swap方法交换
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s1 = "hehe";
string s2 = "gagaga";
cout<<"s1 : "<<s1<<endl;
cout<<"s2 : "<<s2<<endl;
s1.swap(s2);
cout<<"s1 : "<<s1<<endl;
cout<<"s2 : "<<s2<<endl;
cin.get();
}
11)
//+=,append(),push_back()在尾部添加字符
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "hehe";
s += "gaga";
cout<<s<<endl;
s.append("嘿嘿"); //append()方法可以添加字符串
cout<<s<<endl;
s.push_back('k'); //push_back()方法只能添加一个字符...
cout<<s<<endl;
cin.get();
}
12)
//insert() 插入字符.其实,insert运用好,与其他的插入操作是一样的.
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "hehe";
s.insert(0,"头部"); //在头部插入
s.insert(s.size(),"尾部"); //在尾部插入
s.insert(s.size()/2,"中间");//在中间插入
cout<<s<<endl;
cin.get();
}
13)
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg";
s.erase(0,1); //从索引0到索引1,即删除掉了'a'
cout<<s<<endl;
//其实,还可以使用replace方法来执行删除操作
s.replace(2,3,"");//即将指定范围内的字符替换成"",即变相删除了
cout<<s<<endl;
cin.get();
}
14)
//clear() 删除全部字符
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg";
cout<<s.length()<<endl;
s.clear();
cout<<s.length()<<endl;
//使用earse方法变相全删除
s = "dkjfd";
cout<<s.length()<<endl;
s.erase(0,s.length());
cout<<s.length()<<endl;
cin.get();
}
15)
//replace() 替换字符
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg";
s.replace(2,3,"!!!!!");//从索引2开始3个字节的字符全替换成"!!!!!"
cout<<s<<endl;
cin.get();
}
16)
//==,!=,<,<=,>,>=,compare() 比较字符串
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s1 = "abcdefg";
string s2 = "abcdefg";
if (s1==s2)cout<<"s1 == s2"<<endl;
else cout<<"s1 != s2"<<endl;
if (s1!=s2)cout<<"s1 != s2"<<endl;
else cout<<"s1 == s2"<<endl;
if (s1>s2)cout<<"s1 > s2"<<endl;
else cout<<"s1 <= s2"<<endl;
if (s1<=s2)cout<<"s1 <= s2"<<endl;
else cout<<"s1 > s2"<<endl;
cin.get();
}
17)
//size(),length() 返回字符数量
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg";
cout<<s.size()<<endl;
cout<<s.length()<<endl;
cin.get();
}
18)
//max_size() 返回字符的可能最大个数
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg";
cout<<s.max_size()<<endl;
cin.get();
}
19)
//empty() 判断字符串是否为空
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s ;
if (s.empty())
cout<<"s 为空."<<endl;
else
cout<<"s 不为空."<<endl;
s = s + "abcdefg";
if (s.empty())
cout<<"s 为空."<<endl;
else
cout<<"s 不为空."<<endl;
cin.get();
}
20)
// [ ], at() 存取单一字符
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg1111";
cout<<"use []:"<<endl;
for(int i=0; i<s.length(); i++)
{
cout<<s[i]<<endl;
}
cout<<endl;
cout<<"use at():"<<endl;
for(int i=0; i<s.length(); i++)
{
cout<<s.at(i)<<endl;
}
cout<<endl;
cin.get();
}
21)
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg1111";
const char * chs1 = s.c_str();
const char * chs2 = s.data();
cout<<"use at():"<<endl;
int i;
for(i=0; i<s.length(); i++)
{
cout<<"c_str() : "<<chs1[i]<<endl;
cout<<"data() : "<<chs2[i]<<endl;
}
cout<<"c_str() : "<<chs1<<endl;
cout<<"data() : "<<chs2<<endl;
cout<<endl;
cin.get();
}
22)
// substr() 返回某个子字符串
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg1111";
string str = s.substr(5,3);//从索引5开始3个字节
cout<<str<<endl;
cin.get();
}
23)
// find 查找函数
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg1111";
string pattern = "fg";
string::size_type pos;
pos = s.find(pattern,0); //从索引0开始,查找符合字符串"f"的头索引
cout<<pos<<endl;
string str = s.substr(pos,pattern.size());
cout<<str<<endl;
cin.get();
}
24)
// begin() end() 提供类似STL的迭代器支持
#include <string>
#include <iostream>
using namespace std;
void main()
{
string s = "abcdefg1111";
for(string::iterator iter = s.begin(); iter!=s.end(); iter++)
{
cout<<*iter<<endl;
}
cout<<endl;
cin.get();
}