string类
string类是模板类:typedef basic_string<char> string;
使用string类要包含头文件<string>
string对象的初始化:
string s1("hello");
string month="month";
string s2(8,' x');
错误的初始化方法
string e1='c';//error,不能直接用字符去初始化
string e2('u');//error
string e3=22;//error,不能直接用数字去初始化
string e4(8);//error
可以将字符赋值给string对象
string s;
s='n';//ok
(1)string对象的长度用成员函数length()读取:
string s("hello");
cout<<s.length()<<endl;
(2)string支持流读取运算符:
string stringObject;
cin>>stringObject;
(3)string支持getline函数:
string s;
getline(cin,s);//读取一整行到s中
string的赋值和连接
(1)用=赋值
string s1("cat"),s2;
s2=s1;
(2)用assign成员函数赋值
string s1("cat"),s3;
s3.assign(s1);
(3)用assign成员函数部分赋值
string s1("catpig"),s3;
s3.assign(s1,1,3);//从s1中下标为1的字符开始赋值3个字符
(4)单个字符复制:s2[5]=s1[3]='a';
(5)逐个访问string对象中的字符:
string s1("hello");
for(int i=0;i<s1.length();i++)
cout<<s1.at(i)<<endl;
成员函数at会做范围检查,如果超出范围会抛出out_of_range异常,而下标运算符[]不会做范围检查。
(6)用+运算符连接字符串
string s1("good"),s2("morning!");
s1+=s2;
cout<<s1;
(7)用成员函数append连接字符串
s1.append(s2);
s2.append(s1,3,s1.size());//下标为3开始,s1.size()个字符,如果字符串内没有足够字符,则复制到字符串最后一个字符
比较string
(1)用关系比较符比较string的大小:==,>=,<=,!=,>,<,返回值都是bool类型
(2)用成员函数compare比较string的大小:
string s1("hello"),s2("hello");
int f1=s1.compare(s2);//相等返回0,s1大返回1,s1小则返回-1
int f2=s1.compare(1,2,s3,0,3);//部分比较,将s1下标为1开始的两个字符和s3下标从0开始的三个字符比较
子串substr
string s1("hello world"),s2;
s2=s1.substr(4,5);//下标4开始的连续5个字符
交换string
s1.swap(s2);//成员函数swap,交换两个字符串内容
寻找string中的字符
成员函数find()
s1.find("lo");
s1.find("ll",2);//从下标2开始查找
在s1中从前向后查找,“lo”第一次出现的地方,如果找到返回"lo"开始的位置,即l所在的位置下标。如果找不到,返回string::npos(string中定义的静态常量)
成员函数rfind():刚好相反,从后往前找
成员函数find_first_of():
s1.find_first_of("abcd");
在s1中从前向后查找,“abcd”中任何一个字符第一次出现的地方,如果找到则返回字母的位置找不到则返回string::npos;
成员函数find_last_of()作用刚好相反
删除string中的字符
(1)成员函数erase():
s1.erase(5);//删除下标5及之后的字符
替换string中的字符
成员函数replace():
s1.replace(2,3,"haha");//将s1中下标2开始的三个字符换成"haha"
在string中插入字符
成员函数insert():
s1.insert(5,s2);//将s2插入s1下标5的位置
s1.insert(2,s2,5,3);//将s2中下标5开始的3个字符插入到s2中下标2的位置
*转换成C语言char 字符串
成员函数 c_str():
s1.c_str();//返回传统的const char *类型的字符串,且该字符串以"\0"结尾
成员函数data():
const char *p1=s1.data();//s1.data()返回一个char *类型的字符串,对s1的修改可能会使p1出错
for(int i=0;i<s1.length();i++)
printf("%c",*(p1+i));
字符串流处理
除了标准流和文件流输入输出外,还可以从string进行输入输出。
类似istream和ostream进行标准输入输出,我们用istringstream和ostringstream进行字符串上的输入输出,也称为内存输入输出。
#include <string>
#include <iostream>
#include <sstream>