目录
string类简介
string类是C++STL标准模板中的一种,它的用法很多,针对每种,我给出一个实例,便于理解
声明一个字符串
定义
或者说构造一个字符串,初始一个字符串,建立一个字符串,就和你建立一个数组int a[]类似,具体介绍放在代码里
Codes
#include<iostream>
#include<string>
using namespace std;
int main(){
//注释不明白没关系,运行程序输出一下就明了多了
string s1();//声明一个空的字符串,就是null,s1="";
string s2("Beautiful!");//声明一个字符串s2="Beautiful";
string s3(5,'H');//输出5个H,s3="HHHHH",哈哈哈哈哈
string s4("IAmSmart",1,2);//注意,你可以把s4本身理解为一个数组
//s4[0]='I',s4[1]='A',s4[7]='t'
string s5("IAmSmart",3,7);
//输出
cout<<"字符串s2: "<<s2<<endl;
cout<<"字符串s3: "<<s3<<endl;
cout<<"字符串s4: "<<s4<<endl;
cout<<"字符串s5: "<<s5<<endl;
//以上是string的构造函数
//下面我们看看对string对象赋值
string str;//声明了str是一个字符串,
//其实它的用法和char str[]差不多,不同的是string本身有范围限制
//貌似是2GB,就是2048MBchar str[maxn]就不一样了 ,你可以
//把const int maxn=1e9;可以自己定义
char ch[8]={"ABCDEFG"};//貌似最后一个字符默认'\0',是吗?
str="ABCDEFG";
cout<<"这是str: "<<str<<endl;
cout<<"这是ch[8]: "<<ch<<endl;
//string还有一个方法涅
string b1,b2,b3,b4;
string a1("123456789"),a2,a3,a4;
b1=a1;
b2=a2.assign(a1);//copy,复制,a2=a1
b3=a3.assign(a1,1,5);//b3=23456
b4=a4.assign(5,'W');
cout<<"这是b1: "<<b1<<endl;
cout<<"这是b2: "<<b2<<endl;
cout<<"这是b3: "<<b3<<endl;
cout<<"这是b4: "<<b4<<endl;
return 0;
}
运行结果
求字符串的长度
简析
对于string嘛,最直接的有两种,但是对于char ch[]有1种(它们都有阔能有很多种,只是我只写知道的,读者可以在评论区补充的(* ̄︶ ̄).
string s;
s.size()//输入字符串长度
s.length()//输入字符串长度,和上面一样
char ch[100];//比如我输入ch=“ABCD”;//不包括双引号
strlen(ch);//应该为4
sizeof(ch);//应该为100
Codes
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
int main(){
char ch[maxn];//注意,我给ch数组分配的空间1e5+10,也就说size(ch)=maxn;
string str,s;
int lch,lstr,ls,LM;
cout<<"请输入ch[]: ";
cin>>ch;
cout<<"请输入str: ";
cin>>str;
cout<<"请输入s: ";
cin>>s;
lch=strlen(ch);//记住使用头文件#include<cstring>或者#include<string.h>
lstr=str.size();
ls=s.length();
LM=sizeof(ch);
cout<<"lch="<<lch<<" lstr="<<lstr<<" ls="<<ls<<endl;
cout<<"LM= "<<LM<<endl;
return 0;
}
运行结果
字符串的连接
简析
这小块讲的是如何把两个字符串拼在一起,变成一个字符串
比如s1=“123”,s2="ABC"我想得到一个s=“123ABC”
直接调用s.append就可以了
s.append有4种用法,可能吧
string s1(“123”), s2(“ABC”);
s1.append(s2); // s1 = “123ABC”
s1.append(s2, 1, 2); // s1 = “123ABCBC”
s1.append(3, ‘H’); // s1 = “123ABCBCHHH”
s1.append(“ABCDE”, 2, 3); // s1 = “123ABCBCHHHCDE”,添加 “ABCDE” 的子串(2, 3)
Codes
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
string s1("123"),s2("abcd");
cout<<s1.append(s2)<<endl;
cout<<s1.append(s2,1,2)<<endl;
cout<<s1.append(3,'H')<<endl;
cout<<s1.append("SIJKLMN",2,4)<<endl;//S是第一个字符
//2就是从第2个字符,就是J开始,输出后面4个字符
return 0;
}
运行结果
字符串的比较
简析
比较就是孰大孰小和相等,这个就不多说
int flag=s1.compare(s2);
flag的值
-1表示s1比s2小,但s1和s2长度相同
0表示s1=s2
1表示s1和s2长度相同,但是字典序不一样,s1大于s2
x表示s1比s2长度大x
-x表示s1比s2长度小x
Codes
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
while(1){
int flag;
string s1,s2;
cout<<"请输入s1:";
cin>>s1;
cout<<"请输入s2:";
cin>>s2;
flag=s1.compare(s2);
cout<<"flag的结果是:"<<flag<<endl;
}
return 0;
}
运行结果
比较类函数还有一些用法,具体参考C++string类
我写得不是很全面
求字符串的子串
简析
这个求子串就是比如我有一个字符串“abcdefg”,我想得到abcd,或者def
那么我就需要调用substr
string s1("abcdefg");
string s2=s1.substr(0,3);//s2="abc",表示从开始,截取3个字符
s2=s1.substr(4);//s2="efg"
s2=s1.substr(1,5);//表示从1号位起,截取5个字符
Codes
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
string s1,s2;
cin>>s1;
s2=s1.substr(3);
cout<<s2<<endl;
s2=s1.substr(0,3);
cout<<s2<<endl;
s2=s1.substr(2,4);
cout<<s2<<endl;
return 0;
}
运行结果
交换两个字符串
简析
类似于swap函数
string s1(“you”),s2(“me”);
s1.swap(s2);
Codes
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
string s1("you"),s2("me");
cout<<"初始s1: "<<s1<<" 初始s2 :"<<s2<<endl;
s1.swap(s2);
cout<<"交换后s1: "<<s1<<" 交换后s2: "<<s2<<endl;
return 0;
}
运行结果
字符串的查找函数
简析
查找函数find,可以用来查找某个字符或者子串。
下图引用自C语言中文网
Codes
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
int flag;//注意此时不能有空格
cout<<"请输入一个字符串:\n";
cin>>s;
cout<<"查找字符串中的B的结果为第一个B出现的位置:";
flag=s.find('B');
cout<<flag<<endl;
cout<<"查找study 的位置:";//会返回s的位置
flag=s.find("STUDY");
cout<<flag<<endl;
return 0;
}
运行结果
替换字符串中的子串
简析
所谓替换子串就比如
I AM A STUDENT
I WAS A STUDENT
现在我想把AM替换为WAS,那么调用replace函数
Codes
#include<iostream>
#include<string>
using namespace std;
int main(){
string s("I AM A GOOD STUDENT");
cout<<s<<endl;
s.replace(2,2,"WAS",0,3);//
//replace(参数1,参数2,参数3,参数4,参数5)
//参数1:字符串中的位置 参数2:替换的字符串长度
//用来替换的字符串
//参数4,用来替换的字符串起始位置 参数5:用来替换的字符串长度
cout<<s<<endl;
int f=s.find("GOOD");
s.replace(f,4,"PERFECT");//GOOD长4,f是G的位置
cout<<s<<endl;
return 0;
}
运行结果
删除字符串的某个子串
简析
比如ABAABBBABABBAAAAA
我想删除所有的B,那么字符串就变为AAAAAAAAAA
或者字符串I LIKE CAT AND DOG
我想删除DOG
亦或是AA BB CC DD,删除字符串中所有空格
Codes
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
string s("ABAABBBABABBAAAAA"),
st("I LIKE CAT AND DOG"),
str("AA BB CC DD");
for(int i=0;i<s.length();i++){
n=s.find('B');
if(n!=-1)
s=s.erase(n,1);
else break;
}
cout<<s<<endl;
st=st.erase(10,8);//空格算一个字符
//erase(参数1,参数2)参数1是位置,参数2是要删除字符串长度
cout<<st<<endl;
for(int i=0;i<str.length();i++){
n=str.find(' ');
if(n!=-1)
str=str.erase(n,1);
else break;
}
cout<<str<<endl;
return 0;
}
运行结果
插入某个字符串
简析
比如AAAA,我想让它变成AABAA,就要插入一个B
比如一个字符串 I READING.插入一个LIKE让它变成
I LIKE READING
Codes
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
string s("AAAA"),
st("I READING");
cout<<s.insert(2,3,'B')<<endl;//
//insert(参数1,参数2,参数3)参数1位置,参数2插入字符个数,参数3字符
//insert(参数1,参数2)参数1是位置,参数2是字符串
cout<<st.insert(2,"LIKE")<<endl;
return 0;
}
运行结果
输入带有空格的字符串
简析
通常我们定义一个字符串,string str;我们想输入"I am a student"
但是用cin的话会遇到空格或者换行导致结束
所以此时我们引入一个输入getline(cin,str);//参数1是cin,参数2是输入字符串的名字
Codes
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1, s2;
//cin >> s1;
//cout << s1 << endl;
getline(cin, s2);
cout << s2 << endl;
system("pause");
return 0;
}
运行结果
补充(小插曲
简析
有时候会有cin.get(str,length)这个输入方式,参数1是字符串变量名,参数2是字符串最大长度,而且它可以不用string
Codes
#include<iostream>
using namespace std;
int main(){
char ch[100];
//cin >> ch;//在不知道输入的字符串长度情况下
/*
如果知道字符串长度,那么可以使用for循环一个字符一个的输入
比如hello world长度连上空格共为11,那么使用循环也可以输出空格
for(int i=0;i<11;i++)
cin>>ch[i];
for(int i=0;i<11;i++)
cout<<ch[i];
*/
cin.get(ch, 100);
cout << ch << endl;
system("pause");
return 0;
}
运行结果