天天看点

STL 字符串处理

1.字符串基本操作创建

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
int main()
{
     string s1;
     string s2("How are you?");
     string s3(s2);
     string s4(s2,0,3);
     string s5="Fine";
     string s6=s2+"Fine";
     char a[]=" I'm Fine";
     string s7=s2+a;
     cout<<s2<<endl<<s3<<endl<<s4<<endl<<s5<<endl<<s6<<endl<<s7<<endl;
     cout<<s1.size()<<endl;
     cout<<s2.size()<<endl;
     return 0;
}</span>
           

对象s1~s4均是通过构造函数的方式创建新字符串对象。

(1)s1  string对象被创建,但是不包含初始值。 c语言中的char型数组在初始化前都包含随机的无意义的位模式,而与此不同,s1确实包含了有意义的信息,这个string对象被初始化成包含“没有字符”,同过类的成员函数能够正确地报告其长度为0,并没有数据元素。

(2)创建s4对象,构造函数中有三个参数,第一个参数类型是string类型,第二三个参数是整型,分别表示偏移量和计数量。

(3)对象s5,s6通过赋值的方式产生新的对象,s5是单一赋值,可以直接把char型数组赋给s5。s6表明可以把不同的初始化数据源结合在一起,本例即是把一个string对象与一个char型数组结合,构成新对象s6,但是要注意:写成string s6=s2+"Fine",可以编译通过,而写成string s6="Fine"+s2;不能通过,string对象赋值,等号右边第一项必须是string类型,而不能是char 型数组。

2.字符串迭代器创建方式

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
int main()
{
     string s1="How are you?";
     string s2(s1.begin(),s1.end());
     string s3(s1.begin()+4,s1.begin()+7);
     cout<<s1<<endl<<s2<<endl<<s3<<endl;
     return 0;
}</span>
           

3.字符串插入操作

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
int main()
{
     string s="do";
     cout<<s.size()<<endl;
     s.insert(0,"How ");
     s.append(" you ");
     s=s+"do?";
     cout<<s.size()<<endl;
     cout<<s<<endl;
     return 0;
}</span>
           

运行结果:

2

14

How do you do?

知识点:

(1)insert()函数,第一个参数表明插入源串的位置,第二个参数表明要插入的字符串,因此利用该函数可实现串首、串尾及任意位置处的字符串插入功能。

(2)append()函数,有一个输入参数,在源字符串尾部追加该字符串。

(3)利用“+”实现字符串的连接,从而创建新的字符串。

(4)size()函数,无输入参数,通过例子可知:它表明字符串长度值,即有多少个字符,初始的时候值是2,当完成增加后,值就变成14了。这说明字符串string类本身可根据需要自动调节串所在的内存空间大小,编程者无需参与,这一点是C语言中char型数组无法比拟的。

4.字符串替换操作

<span style="font-size:18px;">#include<string>
#include<iostream>
using namespace std;
int main()
{
     string s="What's your name?";
     cout<<s<<endl;
     s.replace(7,4,"her");
     cout<<s<<endl;
     return 0;
}</span>
           

5.字符串查询

主要掌握的知识点如下所示

string::npos :这是string类中的一个成员变量,一般应用在判断系统查询函数的返回值上,若等于该值,表明没有符合查询条件的结果

值。

find()函数:在一个字符串中查找一个指定的单个字符或字符组。如果找到,就返回首次匹配的开始位置;如果没有找到匹配的内容,则

返回string::npos.一般有两个输入参数:一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0。

find_first_of()函数:在一个字符串中进行查找,返回值是第1个与指定字符串中任何字符匹配的字符位置。如果没有找到匹配的内容,则

返回string::npos.一般有两个输入参数:一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0。

find_last_of()函数:在一个字符串中进行查找,返回最后一个与指定字符串中任何字符匹配的字符位置。如果没有找到匹配的内容,则返

回string::npos.一般有两个输入参数:一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0。

find_first_not_of()函数:在一个字符串中进行查找,返回第1个与指定字符串中任何字符都不匹配元素的位置。如果没有找到匹配的内

容,则返回string::npos.一般有两个输入参数:一个是待查询字符串,一个是查询的起始位置,默认起始位置为0。

find_last_not_of()函数:在一个字符串中进行查找,返回下标值最大的与指定字符串中任何字符都不 配的元素的位置。如果没有找到匹配

的内容,则返回string::npos.一般有两个输入参数:一个是待询的字符串,一个是查询的起始位置,默认起始位置为0。

rfind()函数:对一个串从尾至头查找一个指定的单个字符或字符组。如果找到,就返回首次匹配的始位置。如果没有查找到匹配的内

容,则返回string::npos.一般有两个输入参数:一个是待查询的 符串,一个是查询的起始位置,默认起始位置为串尾部。

<span style="font-size:18px;">#include <string>
#include <iostream>
using namespace std; 
int main(int argc, char* argv[])
{
	string s = "what't your name? my name is TOM. How do you do? Fine, thanks. ";
	int n = s.find("your");
	cout << "the first your pos:" << n << endl;
	n = s.find("you", 15);
	cout << "the first your pos begin from 15:" << n << endl;
	n = s.find_first_of("abcde");
	cout << "find pos when character within abcde:" << n << endl;
	n = s.find_first_of("abcde", 3);
	cout << "find pos begin from 2 when character within abcde:" << n << endl ;
	return 0;
}</span>
           

(1)find(“your”), 是从源串起始位置为零(默认值)处查找有”your”字符串位置,所以结果为7。

(2)find(“you”, 15), 是从源串起始位置为15处查找有”you”字符串位置,所以结果为41。

(3)find_first_of(“abcde”),是从源串起始位置为零(默认值)处依次查找每个字符,如果它在输入的字符串参数“abcde”中,则返回该字

符的位置。由于源串头两个字符”w”,”h”不在查找的串中,而第3个字符“a”在查找的目的串中,又由于字符串是以0位基点的,所以结

果值为2。

(4)find_first_of(“abcde”,3),是从源串起始位置为3处依次查找每个字符,如果它在输入的字符串参数“abcde”中,则返回该字符的位置。分析同find_first_of(“abcde”),结果为13,对应的源串字符为“a”。

6.字符串中删除字符

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
int main()
{
     string s1="How are you?";
     s1.erase(s1.begin(),s1.begin()+3);
     cout<<s1<<endl;
     s1.erase(s1.begin(),s1.end());
     cout<<s1<<endl;
     return 0;
}</span>
           

7.字符串比较

主要是依据ASCII值来进行比较大小的。若字符串s1“大于”s2时,表明两者相比较时遇到了第一对不同的字符,字符串s1中第1个不同的

字符比字符串s2中同样位置的字符在ASCII表中的位置更靠后。

C++ STL提供了多种字符串比较方法,它们各具特色。其中最简单的就是使用非成员的重载运算符函

数:operator==、operator!=、operator>、operator<、operator>=、operator<=.

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
int main()
{
     string s1="this";
     string s2="that";
     if(s1>s2)
     {
          cout<<"s1>s2"<<endl;
     }
     if(s1==s2)
     {
          cout<<"s1=s2"<<endl;
     }
     if(s1<s2)
     {
          cout<<"s1<s2"<<endl;
     }
     return 0;
}</span>
           

8.字符串与整型数据之间的转换

<span style="font-size:18px;">#include<iostream>
#include<stdio.h>
#include<string>
#include<sstream>
using namespace std;
int main()
{
     int n1=10;
     int n2;
     string s1;

     stringstream os1;
     os1<<n1;
     os1>>s1;
     cout<<s1<<endl;

     //c中的字符转换
     char a[10];
     sprintf(a,"%d",n1);   //转换为字符串
     sscanf(a,"%d",&n2);  //转换我=为数字
     cout<<s1<<endl<<a<<endl<<n2<<endl;
     return 0;
}</span>