C++ STL 基础及应用(5) 字符串
STL,C++,字符串,string,C2016-06-03
STL string 类提供了强大的功能,使得许多繁琐的编程内容用简单的语句即可完成。
string 字符串类减少了 C/C++ 编程中三种最常见并且造成严重后果的错误:
1.数组越界。
2.通过未被初始化或者被赋值错误的指针来访问数组元素。
3.以及在释放了某一数组原先所分配的存储单元后仍保留的"悬挂"指针。使用 STL string 类时需要头文件 <string>。
#include <iostream>
#include <string>
using namespace std;
int main () {
string s0; //使用默认构造函数初始化,此时s0为空,长度为0,不是随机值
string s1="How"; //通过赋值来初始化
string s2("are"); //通过构造函数初始化
string s3(s1); //通过构造函数初始化
string s4=s2; //通过赋值初始化
string s5=s1+" "+s2+" you?"; //组合赋值
string s6(s5,0,s5.length()); //通过构造函数初始化
string s7(s6.begin(),s6.end()); //通过向构造函数传递两个迭代器来初始化
cout<<s7;
return 0;
}注意!切记保证自己导入了头文件 <string> ,否则会有语句错误,因为 <iostream> 中对 string 类编写有限,读者可自行去掉 #include<string> 来查看编译错误。
#include <iostream>
#include <string>
using namespace std;
int main () {
string s1="Fine!";
s1.append("Thank");
s1.insert(s1.size()," you!");
cout<<s1;
return 0;
}append() 在字符串末尾添加。#include <iostream>
#include <string>
using namespace std;
int main () {
string s="Goodbye world!";
s.replace(0,7,"Hello");
cout<<s;
return 0;
}replace(int m,int n,string s) 第一个参数为替换开始位置,第二个参数为删除几个字符,s为插入的字符。
#include <iostream>
#include <string>
using namespace std;
int main () {
string s="Hello world! hahaha";
s.erase(12,7);
//也可以用迭代器作为参数
//s.erase(s1.begin()+12,s1.begin()+7);
cout<<s;
int p;
cin>>p;
return 0;
} erase() 第一个参数为开始删除位置,第二个参数为删除字符个数
#include <iostream>
#include <string>
using namespace std;
int main () {
string s1="aaa";
string s2="abc";
string s3(s1);
cout<<(s1>s2);
cout<<(s1==s3);
return 0;
}由于 STL 中直接重载了 operator==、operator!=、operator>、operator<、operator>=、operator<=,因此直接用这些运算符比较即可。字符串的比较规则为从前往后依次比较字符的 ASCII 大小。#include <iostream>
#include <string>
using namespace std;
int main () {
string s="Hello World!";
cout<<s.find("World")<<" ";
cout<<s.find_first_of("l")<<" ";
cout<<s.find_first_of("l",5)<<" ";
cout<<s.find_first_not_of("l")<<" ";
cout<<s.find_last_of("l")<<" ";
cout<<s.find_last_not_of("l");
return 0;
}输出:#include <iostream>
#include <string>
using namespace std;
int main () {
string s="How are you?";
string separator=" ";
int prepos=0;
int pos=0;
string result;
while((pos=s.find_first_of(separator,pos)) != string::npos) //查询空格位置
{
result=s.substr(prepos,pos-prepos); //找到一个子串
cout<<result<<endl;
pos++;
prepos=pos;
}
if(pos!=s.size()) //判断有无最后一个子串
{
result=s.substr(prepos,pos-prepos);
cout<<result<<endl;
}
return 0;
}
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main () {
string s="How are you?";
string result;
istringstream sin(s);
while(!sin.eof())
{
sin>>result;
cout<<result<<endl;
}
return 0;
}巧妙地将静态字符串封装成了 istringstream 对象,变为动态,再通过提取符动态拆分字符串。这种“静态-动态”的思维在实际编程中经常用到。但是如果想用 "," 或者其他分隔符分割字符串怎么办?很简单,只需要将 sin>>result 改为 getline(sin,result,',') 即可。