C语言中用char类型来处理字符,对于字符串,只能通过字符数组来处理,显得很不方便。C++STL就比较好了,提供了string这个基本字符系列容器来处理字符串。string很厉害,它不仅可以用下标法来随机访问元素,还提供了添加、删除、替换、查找和比较等丰富的方法,来满足我们对字符串的各种操作。而且它还很容易理解!我们呢,就简单的把它理解为一种基本的数据类型——字符串类就完事了!
下面就开始介绍string的用法喽 请往↓看几个常用的操作
s.length(); //返回字符串长度,,其实这个不太常用
s.size(); //同样是返回长度,这个就比较常用了
s.empty(); //判断是否为空,空为真,不空为假
revrese(s.begin(),s.end());//把区间内元素反向排序,这个函数包含在<algorithm>里面
其他的在下面详细介绍一哈
头文件
#include<string>//这个不必多说,^_^
从定义和初始化开始
1、定义:
char s[]="1234"; //下面用的到的
string str,s_str;//这就定义完啦,str和s_str就是一个string对象了
2、初始化:
str="123";//这样可以
str=s; //这样也可以!
注:当然也可以用cin等输入函数进行初始化, 这里值得注意的一点就是:先用scanf输入char型数组s,然后str=s;速度会比较快!
3、在定义的时候初始化:
string str=s; //编号1
string str(s,s+4); //编号2
string s_str(str); //编号3
string s_str(s.begin().s.end()); //编号4
注:很容易看出来1和3,2和4是很相像的,事实也是如此,区别只是参数的类型不同(char*和string)(特注:我个人是这么理解的,地址,和代器所指的地址应该差别不大,所以我说只是参数类型不同。有可能是错误观点,但目前还没出过错,请选择性吸收!^ _ ^)
然后是插入
1、利用“+”运算符从尾部插入:
str=str+"345";
str=str+s; //运算符‘+’后面跟字符数组
str=str+s_str; //运算符‘+’后面跟string对象
注:发现了string的强大了吗,可以直接用加法运算符啊!!其实除了+,它还可以直接用 >、=、<、>=、<=、!=这些比较运算符!!!
2、利用 append 尾部插入:
str.append();//括号里的参数可以是("asd")这样的,也可以是字符数组和string对象。
3 、利用 insert 插入:
str.insert(n,s); // 在字符串str第2个位置插入字符串s(参数s可以是string对象,也可以是字符数组)
str.insert(n,s,m); // 在字符串str第n个位置插入字符串s的前m个字符
str.insert(n,m,c); // 在字符串str第n个位置插入m个字符c
注:数字n、m可以用迭代器代替。
有插入当然也有删除喽
1 、利用 erase 删除字符或字符串:
str.erase(5); //删除下标为5(包括5)之后的所有字符
str.erase(1,4); //删除下标为[1,4]的所有元素
str.erase(str.begin()); //删除迭代器所指字符
str.erase(str.begin(),str.begin()+3); //删除迭代器所指区间的所有字符
2 、清空字符串:
str=""; //感觉这个很牛皮,直接赋空了给。但是如果用迭代器输出的话,会输出一个空格。。。
接着就是替换
利用replace替换字符串:
str.replace(n,m,s); // 将字符串str第m个位置开始往后的n个字符替换为字符串s
str.replace(n,m,s,x); // 替换为字符串s的前x个字符
str.replace(n,m,x,c); // 替换为x个字符c
str.replace(n,m,s,x,y); // 替换为字符串s中第x个位置开始往后的y个字符
注:s只可以是char类型的字符数组,string对象不可以!如果你想把目标替换成某个字符,可以使s="?";
还有查找
利用find查找字符或字符串:
str.find(c); //返回str中第一次出现字符c的位置
str.find(s); //返回str中第一次出现字符串s的位置
str.rfind(c); //返回str中最后一次出现字符c的位置//与反向迭代器rbegin()有点类似哈
str.rfind(s); //返回str中最后一次出现字串s的位置
注:参数s可以是char类型的字符数组,也可以是string对象。如果没有找到就返回4294967295!!!
最后是比较
利用compare比较字符串:
str.compare(); //参数可以是字符数组,也可以是string对象
注:大于返回1;等于返回0;小于返回-1;
补充一点字符串与数值相互转化的操作
一、字符串转数字:
1、利用sscanf函数
sscanf(s,"%d",&a); //s只能是char类型的字符数组,不能是string对象,
sscanf("1&2+3","%d&%d+%d",&a,&b,&c); //a=1;b=2;c=3 要注意的是间隔符(此处的为&,+)必须保持严格一致
注:可以识别正负,忽略开头的空字符,当遇到第一个非数字字符时结束扫描(如:" -123c34",转化之后为:-123)
2、利用c++函数
double stod(const string &s)//stod为函数名,此函数的特点与sscanf一样,可以识别正负,忽略开头的空字符,
{ //当遇到第一个非数字字符时结束扫描
istringstream i(s);
double x;
if(i >> x)
return x;
return 0.0; //发生错误时返回0.0
}
char s[]="1234";
double a=stod(s); //a=1234.000000 %lf 默认保留六位小数
注:这是模板!!!
3、利用库函数
stoi()//c++库函数,在头文件string内
atoi()//C语言库函数,在头文件stdib.h内
int i=atoi(s.c_str); //先将string转化为char*,然后在使用c库函数
注:只写了两个转化成int型数值的,其他还有double、long等就不一一往上写了。
二、数字转字符串:
1、利用sprintf函数
sprintf(s,"%d",1234);
注:s只能是char类型的字符数组,不能是string对象!!后面的可以是数值,也可以是变量。
2、利用c++函数模板
string atois(double x)
{
ostringstream o;
if(o << x)
{
return x;
}
return "conversion error";//转换错误
}
3、利用库函数
itoa();//C语言库函数,在头文件stdib.h内
to_string( )//c++库函数,它定义在sstream头文件中