谈谈C++中的string

本文深入探讨C++中的string数据类型,包括string的各种初始化方法、字符串的拼接与赋值、字符访问操作以及如何将string视作特殊容器进行操作。同时提供了一个自定义string类的实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在C++中相较C语言多了一个很重要的数据类型,那就是string,接下来我们看看string的特点及使用。

string类:可以把string看成是一个特殊的容器,里面装的是字符

#include <iostream>
#include <map>
using namespace std;
int main()
{
    string str1="yesterday once more";
    string str2("my hear will go on");
    string str3(str1,6);
    string str4(str1,6,3);
    char ch_music[]={"Roly-Poly"};
    string str5=ch_music;
    string str6(ch_music);
    string str7(ch_music,4);
    string str8(10,'i');
    string str9(ch_music+5,ch_music+9);
    cout<<"str1="<<str1<<endl;
    cout<<"str2="<<str2<<endl;
    cout<<"str3="<<str3<<endl;
    cout<<"str4="<<str4<<endl;
    cout<<"str5="<<str5<<endl;
    cout<<"str6="<<str6<<endl;
    cout<<"str7="<<str7<<endl;
    cout<<"str8="<<str8<<endl;
    cout<<"str9="<<str9<<endl;
    return 0;
}

2.赋值、拼接字符串
string 重载了= + +=等多种运算符,让字符串组合拼接更简单

#include <iostream>
#include <map>
using namespace std;
int main()
{
    string str="a woman appreciates";
    string str2=" a man who can make her laugh ";
    string strlove=str+str2;
    cout<<"strlove="<<strlove<<endl;
    str.push_back('!');
    cout<<"str="<<str<<endl;
    str.append("-阿拉丁");
    cout<<"str="<<str<<endl;
    str.assign("dreams come true");
    cout<<"str="<<str<<endl;
    str.insert(16,"!!!");
    cout<<"str="<<str<<endl;
    return 0;
}

3.访问字符操作
string 可以按数组方式,以下标来访问,还可以用at()函数访问指定的字符

#include <iostream>
#include <map>
using namespace std;
int main()
{
    string str="iphone 7";
    cout<<str[2]<<endl;
    cout<<str.at(5)<<endl;
    string stuff;
    getline(cin,stuff);
    cout<<"stuff="<<stuff<<endl;
    getline(cin,stuff,'!');//输入一行字符,赋值给stuff,以'!'结束
    cout<<"stuff="<<stuff<<endl;

    return 0;
}

4.可以把string理解成一个特殊的容器,可以使用STL接口

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string str;
    str.push_back('Q');
    str.push_back('A');
    str.push_back('B');
    string::iterator itstr=str.begin();
    for(;itstr!=str.end();itstr++)
        cout<<*itstr<<" ";
    cout<<endl;
    sort(str.begin(),str.end());//排序
    for(itstr=str.begin();itstr!=str.end();itstr++)
        cout<<*itstr<<" ";
    cout<<endl;
    return 0;
}

  最后我们来自己编写一个my string类。

#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class String
{
    public:
        // String s1 ; String s1("qwerty");
        String(const char *str=NULL);//默认构造函数
        String(const String &str);//复制构造函数
        ~String();//析构函数
        String operator+(const String &str);//字符串连接
        String &operator=(const String &str);//字符串赋值
        bool operator==(const String &str);//判断是否字符串相等
        int Length();//获取字符串长度
        friend ostream &operator<<(ostream &o,const String &str);//重载输出运算符<<
        String Sonstr(int begin,int end);//获取子字符串(begin...end-1)
    private:
        char *addstr;

};
String::String(const char *str)
{
    if(str==NULL)//String s1;
    {
        addstr=new char[1];
        addstr[0]='\0';
    }
    else// String s1("qwertyu")
    {
        addstr=new char[strlen(str)+1];
        strcpy(addstr,str);
    }
}
//String s2(s1);
String::String(const String &str)
{
    addstr=new char[strlen(str.addstr)+1];
    strcpy(addstr,str.addstr);
}
String::~String()
{
    delete [] addstr;
}
//s3=s1+s2   
String String::operator+(const String &str)
{
    String res;
    delete[] res.addstr; //释放原有的空间
    res.addstr=new char[strlen(addstr)+strlen(str.addstr)+1];
    strcpy(res.addstr,addstr);
    strcpy(res.addstr+strlen(addstr),str.addstr);
    return res;
}
//s2=s1  
String &String::operator=(const String &str)
{
    if(addstr==str.addstr)
        return *this;
    delete [] addstr;
    addstr=new char[strlen(str.addstr)+1];
    strcpy(addstr,str.addstr);
    return *this;
}
//s2==s1
bool String::operator==(const String &str)
{
    return strcmp(addstr,str.addstr)==0;
}
//s2 strlen(s2);
int String::Length()
{
    return strlen(addstr);
}
//cout<<str<<endl;
ostream &operator<<(ostream &o,const String &str)
{
    o<<str.addstr;
    return o;
}
//s1="qwertyu"
//    3  6    4     6-3+1    新空间下标 :0 1 2 3
String String::Sonstr(int begin,int end)
{
    String res;
    delete [] res.addstr; //释放原有空间
    res.addstr=new char[end-begin+1];//重新申请内存
    for(int i=0;i+begin<end;i++)
        res.addstr[i]=addstr[begin+i];
    res.addstr[end-begin]='\0';
    return res;
}

int main()
{
    String s1="abcd";
    String s2="abcd";
    cout<<s1<<(s1==s2?"==":"!=")<<s2<<endl;

    String s3="hello";
    String s4="world";
    cout<<s3+s4<<endl;
    cout<<(s3+s4).Sonstr(2,7)<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值