C++从0吃透string类

发布于:2023-01-04 ⋅ 阅读:(202) ⋅ 点赞:(0)

本篇讲解C++中string类的创建和使用,分功能举例建议跟着文章手撸代码,方便记忆理解)

欢迎订阅专栏

Oorik的博客C,C++领域博主

文章目录

string的创建

string常用的基本操作

-.-string的赋值

-.-string的比较

-.-string的拼接

-.-string 查找和替换

-.-string子串提取,切割

 -.-string 插入删除操作

string的创建

string();//创建一个空的字符串 例如:string str;
string(const string &syr);//使用一个string对象初始化另一个string对象
string(const char*s);//使用字符串s初始化
string(int n,char c);//使用n个字符c初始化v
void test01()
{
    string str1("hello world");//用字符串初始化(常用)
    cout<<str1<<endl;
    
    string s1 = "ajajaj";//构造函数(常用)
    cout<<s1<<endl;
    
    string str2(5,'A');//初始化5个A
    cout<<str2<<endl;
    
    string str3=str2;//用str2初始化str3,调用拷贝构造
    cout<<str3<<endl;
    
    string str4;//创建一个空字符串
    str4="hello";
    cout<<str4<<endl;
}
int main()
{
    test01();
    return 0;
}

string常用的基本操作

-.-string的赋值

string&operator=(const char*s);//char*类型字符串 赋值给当前的字符串
string&operator=(const string& s);//把字符串s赋值给当前的字符串
string&operator=(char c);//字符赋值给当前的字符串
string &assign(const char *s);//把字符串s赋给当前的字符串
string &assign(const char *s,int n);//把字符串s的前n个字符赋给当前的字符串
string &assign(const string &s);//把字符串s赋给当前字符串
string &assign(int n,char c);//用n个字符c赋给当前字符串
string &assign(const string &s,int start,int n);//将s从start开始n个字符赋值
void test01()
{
    string str1("hello world");//用字符串初始化
    cout<<str1<<endl;
    str1='WW';//给str1赋值WW改变原来的值
    cout<<str1<<endl;
    str1.assign("love you",5);//把love you的前5个字符赋值给str1
    string str2("okokok");
    str1.assgin(str2,0,3);//将str2从0号下标开始往后3个字符赋值给str1
}
int main()
{
    test01();
    return 0;
}

-.-string的比较

string字符串支持常见的比较操作符(>,>=,<,<=,==,!=),支持stringC-string的比较(如 str < "hello")。
在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按 字典顺序 进行逐一得 比较。字典排序靠前的字符小, 比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面)

==		等于
>		大于
<		小于
>=  	大于或者等于
<=  	小于或者等于
!=  	不等于 
//可用
int compare(const string& s)const;//与字符串s比较
int compare(const char s)const;//与字符串s比较
//大于返回1 小于-1 等于0
void test05()
{
    string str1="hi";
    string str2="ok";
    if(str1>str2)
    {
        cout<<"str1大"<<endl;
    }
    else
    {
        cout<<"str2大"<<endl;
    }
    if(st1.compare(str2)>0)
    {
         cout<<"str1大"<<endl;
    }
    else if(st1.compare(str2)<0)
    {
        cout<<"str2大"<<endl;
    }
     else if(st1.compare(str2)==0)
    {
        cout<<"一样大"<<endl;
    }
}    
    
int main()
{
    test05();
    return 0;
}

-.-string的拼接

string &operator+=(const string &str);//重载+=操作符
string &operator+=(const char *str);//重载+=操作符
string &operator+=(const char c);//重载+=操作符
//利用函数
string& append(const char* s);//把字符串s连接到当前字符串结尾
string& append(const char* s,int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string& s);//同operator+=
string& append(const string& s,int pos,int n);//把字符串s中从pos开始的n各个字符连接到当前字符串结尾
string& append(int n,char c);//在当前字符串结尾添加n个字符c
void test03()
{
    //支持+运算符,代表拼接字符串
    string s1 = "ajajaj";
	string s2 = "ok";
	string s = s1 + s2;
	cout << s << endl;
    
    string st1="hello";
    str1+="world";
    cout<<str1<<endl;
    
    string str2="people";
    str1+=str2;
    cout<<str1<<endl;
    
    string str3="love";
    string str4="you";
    cout<<str3+str4<<endl;
    
    string str5="hikk";
    string str6="opljkgh";
    str5.append(str6,2,3);//把str6下标2位置往后3个字符加到str5后
    cout<<str5<<endl;
    
    string str7="hi";
    str7.append("world",4);
    str7.append(5,'p');//在str7后面添加5个p字符
    cout<<str7<<endl;  
    
}
int main()
{
    test03();
    return 0;
}

-.-string 查找和替换

//从左往右找字符或字符串出现的位置
//没有找到 返回string::npos (理解为-1)
int find(const string& str,int pos=0)const;//查找str第一次出现位置,从pos开始
int find(const char *s,int pos=0)const;//查找字符串s第一次出现的位置,从pos位置开始
int find(const char *s,int pos,int n)const;//从pos位置查找s的前n个字符第一次出现的位置
int find(const char c,int pos=0)const;//查找字符c第一次出现的位置

//从后往前找
//rfind 最后一次出现的位置
int rfind(conststring& str,int pos=npos)const;//查找str最后一次出现的位置,从npos位置开始
int rfind(const char *s,int pos=npos)const;//查找字符串s最后一次出现的位,从npos开始
int rfind(const char*s,int pos,int n)const;//从pos位置查找s的前n个字符最后一次出现的位置
int rfind(const char c,int pos=0)const;//查找字符c最后一次出现的位置

//从pos开始从向后查找字符串s中前n个字符组成的字符串中任意一个字符(子串)在当前串中的位置,成功返回所在位置,失败时返回string::npos的值
int find_first_of(char c, int pos = 0) const;//从pos开始查找字符c第一次出现的位置
int find_first_of(const char *s, int pos = 0) const;
int find_first_of(const char *s, int pos, int n) const;
int find_first_of(const string &s,int pos = 0) const;
//find_first_not_of 不是.
//find_last_of 从右向左

//替换
string& replace(int pos,int n,const string&str);//替换从pos位置开始n个字符为字符串str
stirng& replace(int pos,int n,const char *s);//替换从pos开始的n个字符为字符串s
void test04()
{
    string str1="www.ok.com";
    int ret=str1.find("ok");//找到了返回所在位置,没找到返回返回npos值(很大按-1处理)
    cout<<ret<<endl;
    str1.replace(ret,2,"qqweixin");//长度超过原来长度也不会覆盖后面的
    cout<<str1<<endl;
    
    //找到一个替换一个
    string st2="www.hello.ok.plpl.ok.com";
    while(1)
    {
        int ret=str2.find("ok");
        if(ret==-1){
            break;
        }
        else{
            str2.replace(ret,2,"human");
        }
    }
    cout<<str2<<endl;

}
int main()
{
    test04();
    return 0;
}

-.-string子串提取,切割

string substr(int pos=0,int n=npos)const;//返回由pos开始的n个字符组成的字符串
void test05()
{
    string str1="hi:hello:xixi:okok";
    int pos=0;
    while(1)
    {
        int ret=str1.find(":",pos);//找到:位置
        if(ret<0)
        {
            string temp=str1.substr(pos,str1.size()-pos);
        	cout<<temp<<endl;
            break;
        }
        string temp=str1.substr(pos,ret-pos);
        cout<<temp<<endl;
        pos=ret+1;
    }   
  
}   

 -.-string 插入删除操作

string& insert(int pos,const char*s);//插入字符串
string& insert(int pos,const string& str);//插入字符串,对象
string& insert(int pos,int n,char c);//在指定位置插入n个字符c
string& erase(int pos,int n=npos);//删除从pos位置开始的n个字符
void test05()
{
    string str1="hi:hello";
 	str1.insert(0,"***");
    cout<<st1<<endl;
    str1.erase(0,3);
    cout<<st1<<endl;
 	
    //清空整个字符串
    str1.erase(0,str1.size());
    cout<<st1<<endl;
  
}   
    
int main()
{
    test05();
    return 0;
}

注意:C++中string 和C 语言中 char *

  • string里面保存的字符串没有\0
  • string不能用printf打印,(string本质其实不是字符串,本质上是一个类)
  • C++string提供了访问字符串的接口:data()和c_str():string和char *有时候转换会用到(比如文件操作读写时string类型不能直接读写,只能把string的字符拿出来读写
int main()
{
	string s1 = "ajajaj";
	char a[] = "ajajaj";//有/0
	cout << s1.size() << endl; // 6
	cout << sizeof(a) << endl;//7
	printf("%s\n", s1);//乱码
    printf("%s\t%s\t", s1.data(), s1.c_str());//成功
	return 0;
}

注意:

string符合vector的接口;例如begin/end/resize/size等等

c语言字符串是单独一个char *ptr,自动以\0结尾

而c++string有两个成员char *ptr,size_t,不需要\0,第二个成员确定结尾的位置

string("hlllo",2);会打印hl,字符创内可以包括换行等等可以正常打印,如果size_t长度过长打印出来意想不到的结果

int main()
{
	cout << string("hel\nlop\nkk", 10) << endl;//char * ,size_t

	cout << "hel\0lop\0kk" << endl;//char *
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到