String 类
- 头文件string.h和cstring支持对C风格字符串进行操纵的C库字符串函数,但不支持string类
string类构造
- string类通常把string::npos定义为字符串的最大长度,通常为unsigned int的最大值
string one("Hello"); //构造one字符串
one+="oooops!";//重载+=
//同时可以重载= + [] <<
char alls[] = "you and me run to a different beat";
string three(alls+6,alls+10);
//数组名alls相当于指针,alls+6是char* 类型
string four(alls,10);
cout<<four<<endl;
string five(&four[6],&four[10]);//6到10字节
//不能使用four+6,four+10,因为对象名four不是数组名,不会被看做是对象的地址,four不是指针,所以不行
//只能用&four[6]
cout<<five<<endl;
string six(five,0,3);//0到3字节
cout<<six<<endl;**
C++11新增的构造函数
string oneone = {'k','j'};
cout<<oneone<<endl;
string类输入
对于C风格字符串有以下输入风格
char info[100];
cin>>info;
cin.getline(intfo,100);
cin.get(info,100);
对于string类有两种方式
string stuff;
cin>>stuff;
getline(cin,stuff);
两个版本的getline都有一可选参数,用来指定输入的边界
cin.getline(info,100,":");
getline(stuff,":");
功能上,string类的getline能自动调节目标string对象的大小,使之刚好能够存储输入的字符。
所以string类的getline()不需要指定读取多少个数值参数。
将文件读到整个string时有两个边界,一个是string::npos,一个是程序的内存量。
getline从输入中读取字符,直到发生三种情况
- 1 到达文件尾部,输入流的eofbit被设置,fail()和eof()都被设置为true;
- 2 遇到分界字符,此时删除分界字符并不存储;
- 3 读取字符到达最大边界值,将设置输入流的failbit,意味着fail()设置为true
输入流统计系统
- eofbit 寄存器:检测到文件尾部
- badbit 寄存器:硬件故障
- goodbi t寄存器:一切顺利
- failbit 寄存器:输入错误
文件读到string类
ifstream fin;
fin.open("holly.txt");
if(fin.is_open()==false){//是否成功打开
cout<<"wrong"<<endl;
exit(EXIT_FAILURE);
}
string item;
int cnt = 0;
getline(fin,item,':');
while(fin){
++cnt;
cout<<cnt<<":"<<item<<endl;
getline(fin,item,':');
}
cout<<"Done"<<endl;
fin.close();
return 0;
string类使用
string str1 = "cobra";
length()//
size()//
find()//从pos位置开始查找str或者s,返回首次出现的位置
rfind()//查找str或s最后一次出现的位置
find_first_of()//从本身查找str中任意一个字符首次出现的位置
int pos1 = str1.find_first_of("hark");//返回r的位置 c o b r
find_last_of()//从本身查找str中任意一个字符最后出现的位置
int pos2 = str1.find_last_of("hark");//返回a的位置 a
find_first_not_of()//从本身查找第一个不包含在str中的字符
int pos3 = str1.find_first_not_of("hark");//返回c的位置 c
find_last_not_of()//
int pos4 = str1.find_last_not_of("hark");//返回b的位置 a r b
string其他功能
capacity()
reserve()