文章目录
- 1、string
- 2、string的用法
- 2.1、创建 string 对象
- 2.2、给 string 对象赋值
- 2.3、从 string 对象尾部添加字符
- 2.4、从 string 对象尾部追加字符串
- 2.5、给 string 对象插入字符
- 2.6、访问 string 对象的元素
- 2.7、删除 string 对象的元素
- 2.8、返回 string 对象的长度
- 2.9、替换 string 对象的字符
- 2.10、搜索 string 对象的元素或子串
- 2.11、string 对象的比较
- 2.12、用 reverse 反向排序 string 对象
- 2.13、string 对象作为 vector 元素
- 2.14、string 类型的数字化处理
- 2.15、string 对象与字符数组互操作
- 2.16、string 对象与 sscanf 函数
- 2.17、string 对象与数值相互转换
1、string
c语言只提供了一个char类型用来处理字符,而对于字符串,只能通过字符串数组来处理。
C++STL提供了string基本字符系列容器来处理丰富的字符串,可以把string理解为字符串类,它提供了添加、删除、替换、查找和比较等丰富的方法。
使用 string 容器,需要头文件包含声明#include <string>
2、string的用法
2.1、创建 string 对象
下面这条语句创建了字符串对象 s,s 是一个空字符串,其长度为 0:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;cout<<s.length()<<endl;return 0;
}
2.2、给 string 对象赋值
string 对象赋值一般有两种方式。
(1)直接给字符串对象赋值,如:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="hello,C++STL.";cout<<s<<endl;return 0;
}
运行结果:
hello,C++STL.
(2)更常用的方法是,把字符指针赋给一个字符串对象:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;char ss[5000];//scanf 的输入速度比 cin 快得多//scanf 是 C 语言的函数,不支持 string 对象scanf("%s",&ss);//把整个字符数组赋值给 string 对象s=ss;//输出字符对象cout<<s<<endl;return 0;
}
运行结果(先从键盘上输入“hello,string.”):
hello,string.
hello,string.
2.3、从 string 对象尾部添加字符
在 string 对象的尾部添加一个字符(char),采用“+”操作符即可,具体应用如下:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s=s+'a';s=s+'b';s=s+'c';cout<<s<<endl;return 0;
}
运行结果:
abc
2.4、从 string 对象尾部追加字符串
从尾部追加的方式有两种。
(1)直接采用“+”操作符,代码如下:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s=s+"abc";s=s+"123";cout<<s<<endl;return 0;
}
运行结果:
abc123
(2)采用 append()方法,代码如下:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s.append("abc");s.append("123");cout<<s<<endl;return 0;
}
运行结果:
abc123
2.5、给 string 对象插入字符
(1)在原串下标为pos的字符前插入字符串str
basic_string& insert (size_type pos, const basic_string& str);
#include<iostream>
#include<string>
using namespace std;
int main()
{string str="acmer";string s="oier";str.insert(1,s);//在原串下标为1的字符c前插入字符串scout<<str<<endl;return 0;
}
输出:aoiercmer
(2)str从下标为pos1开始数的n个字符插在原串下标为pos的字符前
basic_string& insert (size_type pos, const basic_string& str, size_type pos1, size_type n);
#include<iostream>
#include<string>
using namespace std;
int main()
{string str2="hello";string s2="weakhaha";str2.insert(0,s2,1,3);//将字符串s2从下标为1的e开始数3个字符,分别是eak,插入原串的下标为0的字符h前cout<<str2<<endl;return 0;
}
输出:eakhello
(3)在原串下标为pos的字符前插入n个字符c
basic_string& insert (size_type pos, size_type n, char c);
#include<iostream>
#include<string>
using namespace std;
int main()
{string str1="hello";char c='x';str1.insert(4,5,c);//在原串下标为4的字符o前插入5个字符ccout<<str1<<endl;return 0;
}
输出:hellxxxxxo
可以使用 insert()方法把一个字符插入到迭代器位置之前,代码如下:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="123456";//定义迭代器string::iterator it;//迭代器位置为字符串首it=s.begin();//把字符'p'插入到第 1 个字符前(注意,字符位置是从 0 开始计数)s.insert(it+1,'p');cout<<s<<endl;return 0;
}
运行结果:
1p23456
2.6、访问 string 对象的元素
一般使用下标方式随机访问 string 对象的元素,下标是从 0 开始计数的。另外,string对象的元素是一个字符(char)。代码如下:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="abc123456";//输出 string 对象的首元素cout<<s[0]<<endl;//两个相同的字符相减值为 0cout<<s[0]-'a'<<endl;return 0;
}
运行结果:
a
0
2.7、删除 string 对象的元素
(1)清空一个字符串,则直接给它赋空字符串即可。
(2)使用 erase()方法删除迭代器所指的那个元素或一个区间中的所有元素。
erase()是STL提供的容器中比较常用的方法之一,它的功能是删除容器中的某些元素,其中它的函数原型如下:
删除容器中从pos位置开始的n个元素
string& erase ( size_t pos = 0, size_t n = npos );
#include<iostream>
using namespace std;int main()
{string str = "hello world!";cout<<str.erase(0,1)<<endl;
}
string容器特有的erase用法:
#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="abc123456";//定义迭代器变量,指向字符串对象首元素string::iterator it=s.begin();//删除第 3 个元素,元素位置从 0 开始计数s.erase(it+3);cout<<s<<endl;//删除 0~4 区间的所有元素,左闭右开s.erase(it,it+4);cout<<s<<endl;//清空字符串s="";//输出字符串的长度cout<<s.length()<<endl;return 0;
}
运行结果:
abc23456
3456
0
2.8、返回 string 对象的长度
采用 length()方法可返回字符串的长度;采用 empty()方法,可返回字符串是否为空,
如果字符串为空,则返回逻辑真,即 1,否则,返回逻辑假,即 0。代码如下:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="abc123456";//输出字符串的长度cout<<s.length()<<endl;//清空字符串s="";//判断字符串是否为空cout<<s.empty()<<endl;return 0;
}
运行结果:
9
1
2.9、替换 string 对象的字符
使用 replace()方法可以很方便地替换 string 对象中的字符,replace()方法的重载函数相当多,常用的只有一两个,具体代码如下:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="abc123456";//从第 3 个开始,将连续的 3 个字符替换为“good”//即将“abc”替换为“good”s.replace(3,3,"good");cout<<s<<endl;return 0;
}
运行结果:
abcgood456
2.10、搜索 string 对象的元素或子串
采用 find()方法可查找字符串中的第一个字符元素(char,用单引号界定)或者子串(用双引号界定),如果查到,则返回下标值(从 0 开始计数),如果查不到,则返回 4294967295。
find()方法有很多重载函数,下面的代码,仅举出了一种用法。
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="cat dog cat";//查找第一个字符‘c’,返回下标值cout<<s.find('c')<<endl;//查找第一个子串“c”,返回下标值cout<<s.find("c")<<endl;//查找第一个子串“cat”,返回下标值cout<<s.find("cat")<<endl;//查找第一个子串“dog”,返回下标值cout<<s.find("dog")<<endl;//查找第一个子串“dogc”,查不到则返回 4294967295cout<<s.find("dogc")<<endl;return 0;
}
运行结果:
0
0
0
4
4294967295
2.11、string 对象的比较
string 对象可与使用 compare()方法与其他字符串相比较。如果它比对方大,则返回 1;如果它比对方小,则返回-1;如果它与对方相同(相等),则返回 0。代码如下:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="cat dog cat";//s 比“cat”字符串大,返回 1cout<<s.compare("cat")<<endl;//s 与“cat dog cat”相等,返回 0cout<<s.compare("cat dog cat")<<endl;//s 比“dog”小,返回-1cout<<s.compare("dog")<<endl;return 0;
}
运行结果:
1
0
-1
2.12、用 reverse 反向排序 string 对象
采用 reverse()方法可将 string 对象迭代器所指向的一段区间中的元素(字符)反向排序。reverse()方法需要声明头文件#include <algorithm>
。代码如下:
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{string s;s="123456789";reverse(s.begin(),s.end());cout<<s<<endl;return 0;
}
运行结果:
987654321
2.13、string 对象作为 vector 元素
string 对象可以作为 vector 向量的元素,这种用法,类似于字符串数组。代码如下:
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{vector<string> v;v.push_back("Jack");v.push_back("Mike");v.push_back("Tom");cout<<v[0]<<endl;cout<<v[1]<<endl;cout<<v[2]<<endl;cout<<v[0][0]<<endl;cout<<v[1][0]<<endl;cout<<v[2].length()<<endl;return 0;
}
运行结果:
Jack
Mike
Tom
J
M
3
2.14、string 类型的数字化处理
ACM 竞赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时候,我们可以将读入的数据当成字符串来处理,这样就方便、省时多了。下面这个程序演示了求一个整数各位的和:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="1234059";int i;int sum=0;for(i=0;i<s.length();i++){if(s[i]=='0')sum+=0;else if(s[i]=='1')sum+=1;else if(s[i]=='2')sum+=2;else if(s[i]=='3')sum+=3;else if(s[i]=='4')sum+=4;else if(s[i]=='5')sum+=5;else if(s[i]=='6')sum+=6;else if(s[i]=='7')sum+=7;else if(s[i]=='8')sum+=8;else if(s[i]=='9')sum+=9;}cout<<sum<<endl;return 0;
}
运行结果:
24
2.15、string 对象与字符数组互操作
下面这个程序演示了字符数组与 string 对象的输入与输出:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;char ss[100];//输入字符串到字符数组中scanf("%s",&ss);//字符数组赋值线字符串对象s=ss;//用 printf 输出字符串对象,要采用 c_str()方法printf(s.c_str());//换行cout<<endl;//用 printf 输出字符数组printf("%s",ss);//换行cout<<endl;//用 cout 输出字符串对象cout<<s<<endl;//用 cout 输出字符数组cout<<ss<<endl;return 0;
}
输出结果(从键盘输入“abc123”字符串后回车):
abc123
abc123
abc123
abc123
abc123
2.16、string 对象与 sscanf 函数
在 C 语言中,sscanf 函数很管用,它可以把一个字符串按你需要的方式分离出子串,甚至是数字。下面这个程序演示了 sscanf 函数的具体用法:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s1,s2,s3;char sa[100],sb[100],sc[100];//将字符串分离成子串,分隔符为空格sscanf("abc 123 pc","%s %s %s",sa,sb,sc);s1=sa;s2=sb;s3=sc;cout<<s1<<" "<<s2<<" "<<s3<<endl;//将字符串分离成数字,分隔符为空格//当用到数字的时候,跟 scanf 一样,它要传指针地址int a,b,c;sscanf("1 2 3","%d %d %d",&a,&b,&c);cout<<a<<" "<<b<<" "<<c<<endl;//将字符串分离成数字,分隔符为“,”和“$”//当用到数字的时候,跟 scanf 一样,它要传指针地址int x,y,z;sscanf("4,5$6","%d,%d$%d",&x,&y,&z);cout<<x<<" "<<y<<" "<<z<<endl;return 0;
}
运行结果:
abc 123 pc
1 2 3
4 5 6
2.17、string 对象与数值相互转换
有时候,string 对象与数值之间需要相互转换,下面这个例子详细说明了如何完成这项工作:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//C++方法:将数值转换为 string
string convertToString(double x){ostringstream o;if (o << x)return o.str();return "conversion error";//if error}
//C++方法:将 string 转换为数值
double convertFromString(const string &s){istringstream i(s);double x;if (i >> x)return x;return 0.0;//if error}
int main(int argc, char* argv[])
{//将数值转换为 string 的第一种方法:C 方法char b[10];string a;sprintf(b,"%d",1975);a=b;cout<<a<<endl;//将数值转换为 string 的第二种方法:C++方法string cc=convertToString(1976);cout<<cc<<endl;//将 string 转换为数值的方法:C++方法string dd="2006";int p=convertFromString(dd)+2;cout<<p<<endl;return 0;
}