c++string详解

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();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值