标准库类型string是一个可变长的字符序列。
使用string类型必须包含string头文件,string定义在命名空间std中,使用string类,必须包含以下代码:
#include<string>
using std::string // string定义在命名空间std中
建议:我们应该尽可能的使用标准类库,因为它对于一般应用场合来说有足够的效率,代码健壮性强
1.1 如何初始化类的对象是由这个类本身决定的,一个类可以定义很多种初始化对象的方式,但方式之间有所区别:要么类型不同,要么参数不同
1.2 初始化对象的方式
string s1; // 默认初始化,s1是个空字符串
string s2(s1); // s2是s1的副本
string s2=s1; // 等价于s2(s1),s2是s1的副本
string s3("value"); // s3是字面值value的副本,不包含value后的那个空字符
string s4(10,'c'); // s4初始化为10个连续的c组成的串
1.3 直接初始化和拷贝初始化
string s3("value"); // 直接初始化
string s4(10,'c'); // 直接初始化
string s2=s1; // 拷贝初始化,调用拷贝构造函数 其中的参数为const string &类型
cin>>s; cout<<s; s[n]
s1==s2; s1=s2; s1!=s2; s1+=s2; < <= > >= // 运算符重载,尽量类似内置类型(计算机硬件能识别的类型,如int,char等)的规则
s.empty() // s为空返回真 返回值为bool类型
s.size(); // 返回s字符串字符的个数,返回类型为size_type类型
2.1 使用getline读取一整行
有时候我们希望字符串中保留输入时的空格字符(cin>>s不能输出空格),应该使用getline替代原来的>>运算符,getline函数参数一个为输入流,一个是string类对象
2.2 string::size_type类型
s.size(); // 返回s字符串字符的个数,返回类型为size_type类型
size_type类型是在string中定义的,它是一个无符号整型类型,因此切记在表达式中混用带符号和无符号数可能产生意想不到的后果,例如假设n是一个int型负数,s.size()<n可以几乎肯定是true,因为负数会自动转换为比较大的无符号的值
2.3 比较string对象、为string对象赋值、字面值和string对象相加 类似于内置类型的运算
(2)、注意:由于C++要与C进行兼容,所以字符串字面值并不是string类的对象,字符串字面值和string是不同类型,举例:
string s7="hello"+", "+s1; // 错误,不能将字面值进行直接相加
string s7="hello"+s1+“world”; // 正确, string s7=("hello"+s1)+“world”; "hello"+s1的结果是string临时对象
我们经常单独处理string对象的字符,比如检查一个string对象是否包含空白,或者把string对象中的小写变成大写,再或者特定的字符是否出现等等,处理这类问题的关键就是在于如何获取字符本身。来看看cctype头文件定义的标准库函数处理这类问题:
isalnum(c); // c为字母或者数字时,为真
isdigit(c); // c是数字时,为真
isalpha(c); // c是字母时,为真
isspace(c); // c是空格时,为真
islower(c); // c是小写字母时,为真
isupper(c); // c是大写字母时,为真
toupper(c); // 若c是小写字母,输出对应的大写字母,否则原样输出
tolower(c); // 若c是大写字母,输出对应的小写字母,否则原样输出
3.1处理每个字符?使用基于范围的for语句
C++11新标准提供了一种语句:范围for语句。(vs2010不支持,因为范围for语句推出时间是2011年),这种语句遍历给定序列中的每个元素,并对某个值进行操作,其语法形式:
string str("some string");
for(auto c:str) auto c 也可以直接换成 auto &c(引用),这样对c的操作可以改变str中字符的值
cout<<c<<endl;
3.2 只处理一部分字符?
(1)想访问字符串中单个字符:一种是使用下标,另一种是使用迭代器(在以后章节中陆续介绍)
(2)下标运算符[]:
接受输入参数为string:size_type类型的值,这个参数表示访问字符的位置,返回值为该位置字符的引用
(3) string对象的下标必须大于等于0,小于size(),超出范围的下标将产生不可预知的结果。
(4) 代码健壮性:
(1) if(!s.empty()) // 先判断s不为空,再进行输出
cout<<s[0]<<endl;
(2) for(decltype(s.size()) index=0; //处理s中字符,直至我们处理完成或者遇到一个空白结束
index !=s.size()&&!isspace(s[index]); ++index)
s[index]=toupper(s[index]);
(5) 检查下标是否合法性
C++标准并没有要求标准库检查合法性,因此自己使用的时候,这个地方一定注意。
(6) 使用下标可以随机进行访问
举例:
想要编写程序把0到15之间的十进制数转换为对应的十六进制形式
const string hexdigits="0123456789ABCDEF"; // 可能的十六进制数字
cout<<"Enter a series of numbers between 0 and 15"<<endl;
string result; // 用于保存十六进制的字符串
string::size_type n; // 输入流中读数
while(cin>>n)
if(n<hexdigits.size()) // 忽略无效输入
result +=hexdigits[n];
cout<<"Your hex number is:"<<result<<endl;