标准库类型String
string表示可变长的字符序列,使用string要包含头文件,string定义在命名空间std中。
1.定义和初始化string
类对象如何初始化是由类本身决定的(各种构造函数决定)。 下面介绍string对象的初始化方式:
- 默认初始化:默认初始化是调用string类的默认构造函数初始化
string s1; //默认初始化,s1是一个空字符串
- 拷贝初始化:拷贝初始化是调用string类的拷贝构造函数初始化
string s2(s1); //拷贝初始化,用s1的值初始化s2,等价于如下2:
string s3 = s1; //拷贝初始化等价形式
- 直接初始化:直接初始化是调用string类的有参构造函数进行初始化
string s4("abc"); //直接初始化,s4的内容为"abc"
string s5(10,'c');//直接初始化,s5的内容为10个'c'
- 列表初始化:
string s6{"abc"}; //s6的内容是"abc"
string s7={"abc"}; //s7的内容也是"abc"
//s6 s7等价于s4的直接初始化
- 值初始化
string s8(); //错误。
string s9{}; //值初始化为0
2.string对象上的操作
一个类除了要规定初始化对象的方式(构造函数),还要定义对象上所能执行的操作。
2.1string对象上的操作
string对象上有如下操作:
- os<<s 将s写到输出流os中,返回os
- is>>s 从is中读取字符串赋值给s,字符串以空白分隔,返回is
- getline(is,s) 从is中读取一行赋给s,返回is
- s.empty() s为空返回true
- s.size() 返回s中字符的个数
- s[n] 返回s中第n个字符的引用,位置n从0记起
- s1+s2 返回s1和s2连接后的结果
- s1=s2 用s2的副本替代s1中原来的字符
- s1==s2 判断s1和s2是否相等,相等返回true
- s1!=s2 等性判断对字母的大小写敏感
- <,<=,>,>= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感
①string::size_type类型
size函数和下标运算符返回的是一个string::size_type类型,string::size_type是一个无符号整型而且足够放下任何string对象的大小,以用来兼容不同机器,体现标准库类型与机器无关的特性。关于string::size_type有几个需要注意的点:
- string::size_type是无符号类型,要避免与有符号数int混用,混用有符号数和无符号数可能出错。
- string::size_type可以和有符号数进行转换。 如:
int len = s.size(); //string::size_type转换成int类型
int i=10;
s[i]; //有符号类型int转换成string::size_type类型
②字符串字面值类型
字符串字面值本质是字符数组,以‘\t’结束。切记,**字符串字面值与string是不同的类型。**string类关于字符串字面值的操作:
//1.赋值和初始值操作
string s1("abc"); //初始化
string s2;
s2="abc"; //赋值
//2.+操作
string s3=s1+"efg";
//3.+=操作
string s3+="hij";
2.2string对象中的字符的操作
我们经常需要单独处理string对象中的字符,比如检查一个string对象中是否包含空白,或者把string对象中的字母改成小写等…
这类操作的关键是如何获取字符本身,有时需要处理对象中的每一个字符,另外一些时候只需要处理某个特定的字符。
①在cctype头文件中定义了一组标准库函数处理单个字符
- isalnum© 当c是字母或数字是为真
- isalpha© 当c是字母是为真
- isdigit© 当c是数字时为真
- islower© 当c是小写字母是为真
- isspace© 当c是空白时为真
- is upper© 当c时大写字母为真
- tolower© 如果c时大写字母,输出对应小写字母,否则原样输出c
- toupper© 如果c是小写字母,输出对应的大写字母,否则原样输出c
②利用范围for语句处理每个字符
范围for循环遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:
for (declaration:expression) {
statement
}
其中,expression是一个序列对象,如vector或string对象。declaration表示一个变量,用于访问序列中元素,statement表示对这个对象进行的某种操作。
如:把string对象中的元素全部打印出来
string s("abcd");
for (char c : s) {
cout << c<< " ";
}
打印结果为:a b c d
又如:将s中的小写字符全变成大写字符
string s("akzzzz");
for (auto &c : s) {
c=toupper(c); //c是一个引用,因此赋值语句将改变s中字符的值
cout << c ;
}
③利用下标运算符处理某个字符
使用下标运算符时有两个条件:
- string对象不为空,因此每次使用下标运算符之前需要判断对象不为空
- 下标大于等于0且小于size(),超出范围下标将引发不可预知的结果
例:输入i,利用下标运算符将的字符串的第i个字符改成小写形式:
string s{"ABCDEFG"};
int i;
cin>>i;
if (!s.empty() && i >= 0 && i < s.size()) {
s[5] = tolower(s[5]);
}