c++ string知识点


  来了老弟      103   
  2021-01-13      C++      

string定义本质和与cstring的区别

头文件:一定要记得的加上
定义:string 类是 STL 中 basic_string 模板实例化得到的模板类。
本质:string是一个类是一个容器## 标题
区别: string与从cstring的区别是string可以进行+=,-=,>等运算但是cstring不能。
且string是c++中标准库函数,cstring可兼容c与c++支持格式的库函数。

string的基本构造函数

一 :‘=’赋值或者assign赋值;
先定义一个string类型变量:
string str;
(1) string s; //生成一个空字符串s (定义变量)
(2) string s(str) //复制构造函数 生成str的复制品
(3) string s(str,x) //访问从第X个元素开始的元素作为s的初值
(4) string s(cstr) //将C字符串作为s的初值
(5) string s(int num,c) //生成一个字符串,包含num个c字符
(6) string s(str,beg,end) //将区间[beg,end)输出不包含end

// 
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str("Sweet tea");
    string s1(str);//将string中元素复制到s1中 
    cout << s1 << endl;
    string sx(str,6);//访问从第六个元素开始的后面的元素 
    cout << sx <<endl;
    string sy("Sweet tea",5);//访问前5个元素
    cout << sy << endl; 
    string s2("Sweet");//赋值给s3 
    cout << s2 << endl; 
    string s3(5,'A');//生成一个字符串,包含5个A 
    cout << s3 << endl; 
    string s4(str,0,5);//输出str中从0到5的元素不包含第五个元素
    cout << s4 << endl;
    return 0;
}

运行结果:

c++  string知识点 - 第1张

二:字符串拼接:
重载
string s1(“我”);
string s2;
s1+=“爱玩游戏”;(还可以直接加字符串 s1+=s2);
下面展示一些 内联代码片

//
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1("我");
    s1+="爱玩游戏";
    cout << s1; 
    return 0;
}

输出结果

c++  string知识点 - 第2张

append语法
string s2=‘I’;
s2.append(" love");

// 
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s2="I";
    s2.append(" love"); 
    cout << s2; 
    return 0;
}

输出结果

c++  string知识点 - 第3张

或者s2.append(“love”,3)截取前三个(也可以加字符串)

//
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s2="I";
    s2.append(" love",3); 
    cout << s2; 
    return 0;
}

输出结果

c++  string知识点 - 第4张

s2.append(s1,x,y)只截取从x到y的函数不包含y;

//
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s2="I";
    string s1=" love";
    s2.append(s1,0,4); 
    cout << s2; 
    return 0;
}

输出结果

c++  string知识点 - 第5张

string的库函数

一. 字符串查找:(有返回值,如果找到则会返回d的下标从0开始的,如果没有找到则会返回-1。)

c++  string知识点 - 第6张

1.find函数(查找数组指定字符串或者字符是否存在;从左向右查找找到左边最先出现的字符下标)
字符串
string s1(“abcdef”);
int t = s1.find(“de”);
s1.find(“字符串,3”) //代表从3位置开始找。
s1.find(“字符,x,y”) //从x位置查找前y个字符第一次出现字符的位置。
2.rfind函数(从右向左查找找到右边最先出现的字符下标)
二. 字符串替换:
1.replace函数

c++  string知识点 - 第7张
// 
    string s1="kove";
    s1.replace(1,3,"222"); s1.replace(int x,int y," ");
    //表示从x位置开始的y个字符结束替换成"222"
    cout << s1; 

三.字符串比较(实际上是进行ASCII码比较,逐个比较大小):
1.compare函数(主要用于比较字符串是否相等)
若=则返回0;
若>则返回1;
若<则返回-1;

c++  string知识点 - 第8张
// 
    string s1="hello";
    string s2="hello";
    if(s1.compare(s2) == 0)
    {
        cout <<"相等"<< endl; 
    }
    else if(s1.compare(s2)>0 )
    {
        cout << "s1大于s2" << endl;
    }
    else if(s1.compare(s2)<0 )
    {
        cout << "s1小于s2" << endl;
    }

四.字符存取
1.可直接采用下标方式取用[ ]
2.采用at方式

c++  string知识点 - 第9张

*下标方式比较简单直接读取即可

// 
    string s1="hello";
    for(int i=0;i<s1.size();i++)
    {
        cout << s1.at(i) <<" ";//读取; 
    }
    //修改
    s1.at(0) = 'x';

五.插入和删除
1.insert插入函数和erase删除函数
***(插入和删除的下标都是从0开始的)

c++  string知识点 - 第10张

*前两个是c风格和c++风格的两种不同形式本质上相同

// 
    string str = "hello";
    //插入 
    str.insert(1,"111")//在1位置插入三个1 
    str.insert(1,3,"k")//在1位置插入三个字符k  
    //删除 
    str.erase(1,3)//删除从1位置起3个字符  

六:字符串获取(从字符串中截取一小段我们想得到的字符串)
substr函数

c++  string知识点 - 第11张

pos起始位置 npos是截取个数

// 
    string s1;
    string str = "Sweet tea";
    s1=str.substr(6,3);  
    cout << s1 << endl;
    //从邮件中获取姓名
    string s2 = "zhangsan@qq.com";
    int t = s2.find("@");
    cout << s2.substr(0,t);

七.交换函数swap

void swap( basic_string &str );
// 
    string s1 = "I love";
    string str = "Sweet tea";
    str.swap(s1);
    cout << str <<" "<< s1<< endl; 

输出结果

c++  string知识点 - 第12张

八.字符串反转函数reverse

// 
    //需要使用algorithm头文件 
    string str = "Sweet tea";
    reverse(str.begin(),str.end());
    cout << str << endl; 

九.复制函数copy

size_type copy( char *str, size_type num, size_type index );
将内容复制为一个**字符数组**
copy()函数拷贝自己的num个字符到str中(从索引index开始)。返回值是拷贝的字符数
//
string str = ("Sweet tea");
    char s1[10];
    str.copy(s1,5,0); 
    //将str中的从0开始的5个元素复制到s1数组中 
    cout << s1 << endl; 

输出结果

c++  string知识点 - 第13张

十.重新设置字符串大小函数resize

void resize( size_type num );
void resize( size_type num, char ch );
重新设置字符串的大小
resize()函数改变本字符串的大小到num, 新空间的内容不确定。也可以指定用ch填充。
//   
    string str2( "123456789" );
    str2.resize(5);
    cout << str2 << endl;
    cout << str2.size() << endl;

运行结果

c++  string知识点 - 第14张

十一.字符串大小函数size和length

//
    string str = ("Sweet tea");
    int x,y;
    x = str.size();
    y = str.length(); 
    cout << x << " " << y << endl; 

输出结果

c++  string知识点 - 第15张

十二.当前字符容量函数capacity和扩容reserve和resize函数

size_type capacity();
返回重新分配空间前的字符容量
// 
    //输出内存大小
    string s("To be or not to be");
    cout<<s.capacity();

输出结果为23

reserve
void reserve( size_type num );
让操作者能够请求内存块的最小长度,也就是将容量变大,但不能变小。
// 
    //修改内存大小
    s.reserve(50);//如果输入s.reserve(17),也就是小于原来的18,容量值还是18
    cout<<s.capacity()<<endl;
//  
        s14.resize(100);
      cout << s14.capacity() <<endl;

输出结果为100
十三.字符串指定输出assign函数

//

     string s17;
     s17.assign("what are you saying",5);
     s17.assign(5,'c')//把五个字符c赋值给s17

输出结果

c++  string知识点 - 第16张

十四.全输出c_str函数

// 
     string s16="That is a question";
     cout<<s16.c_str()<<endl;

string库函数整体实现

// 
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    cout << "字符查找1" <<endl;
     string s1("abcdefbc");
     int t = s1.find("bc");
     int p = s1.find("bc",3); //从位置三开始查找 
     cout << t << " " <<  p << endl;
     cout << "字符查找2" <<endl;
     string s2("abcdefbc");
     int x = s2.rfind("bc");
     cout << x << endl;
     cout << "字符串替换" <<endl;
     string s3("abcde");
     cout << s3.replace(1,3,"1111") <<endl;
     cout << "字符串比较" <<endl;
     string s4="hello";
     string s5="hello";
    if(s4.compare(s5) == 0)
        cout <<"相等"<< endl; 
    else if(s4.compare(s5)>0 )
        cout << "s4大于s5" << endl;
    else if(s4.compare(s5)<0 )
        cout << "s4小于s5" << endl;
     cout << "字符存取" <<endl;
        string a="123456789";
        cout << a[1] << endl;
        cout << a.at(2) << endl;
    cout << "插入和删除" <<endl;
    //插入 
    string s6 = "hello";
    cout << s6.insert(1,"222") <<endl;
    cout << s6.insert(1,3,'a') <<endl;
    //删除
    cout << s6.erase(1,3) <<endl;
    cout << "字符串获取" <<endl;
    string s7;
    string str = "Sweet tea";
    s7=str.substr(6,3); //起始位置和截取个数 
    cout << s7 << endl;
    //从邮件中获取姓名
    string s8 = "zhangsan@qq.com";
    int l = s8.find("@");
    cout << s8.substr(0,l) << endl;
    cout << "交换函数" << endl;
    string s9 = "I love";
    string s10 = "Sweet tea";
    s10.swap(s9);
    cout << s10 <<" "<< s9<< endl; 
    cout << "字符反转" << endl;
    //需要使用algorithm头文件 
    string s11 = "Sweet tea";
    reverse(s11.begin(),s11.end());
    cout << s11 << endl; 
    cout << "复制函数" <<endl;
    string s12 = ("Sweet tea");
    char s13[10];
    str.copy(s13,5,0); 
    //将s12中的从0开始的5个元素复制到s13数组中 
    cout << s13 << endl; 
    cout << "重置字符串大小" <<endl;
    string str2( "123456789" );
    str2.resize(5);
    cout << str2 << endl;
    cout << str2.size() << endl;
    cout << "字符串大小" << endl;
    string s15 = ("Sweet tea");
    int q,y;
    q = s15.size();
    y = s15.length(); 
    cout << q << " " << y << endl; 
    cout << "当前字符容量" <<endl;
    //输出内存大小
    string s14("To be or not to be");
    cout<<s14.capacity() <<endl; 
    //修改内存大小(只能变大不能变小) 
    s14.reserve(50);//如果输入s14.reserve(17),也就是小于原来的18,容量值还是18
    cout<<s14.capacity()<<endl;
      s14.resize(100);
      cout << s14.capacity() <<endl;
      cout<<"指定输出:\n";
     string s17;
     s17.assign("what are you saying",5);
     cout<<s17<<endl;
    cout<<"全输出:\n";
     string s16="That is a question";
     cout<<s16.c_str()<<endl;
    return 0;
} 

输出结果

c++  string知识点 - 第17张
c++  string知识点 - 第18张

其他

getline直接读取一行可以读空格;getline是读取一行,其实是包括回车的(但读取的内容里头是没有回车的),此时再读取已经到了下一行
1)利用cin读取 字符串
cin使用空白(空格、制表符、换行符(通过回车符输入))来确定字符串的 结束位置 ,这意味着 通过cin读入字符数组时只读取一个单词 ,空白仍保留在流中,读取该单词后,cin将该字符串放在数组中,并自动在结尾加入空字符(‘\0’); 流中单词之前的空白将被忽视,而直接保存单词;单词之后的空格仍保存在流中!
2)cout输出字符数组时注意的问题
输出时,逐个输出字符直到遇到结束符\0为止。
作者:渔yyy

ps:以上是c++ string知识点全部内容,希望文章能够帮你解决c++ string知识点所遇到的游戏开发问题。
本文收录在 游戏编程 🕹️ - 学习C++专题,分享走一走~

 字符串   

猜你喜欢 全系列


您可以在登录后,发表评论




    关于作者
    游戏开发者 - 107
  • 来了老弟
  • 码神
  • 519 文章  √   8 提问  ?
    此作者缺少注释。


    目录