标准库类型string
标准库类型string:表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中,如:
#include <string>
using std::string;
1.定义和初始化string对象
1)拷贝初始化:使用等号(=)初始化的变量(编译器把等号右侧的初始值拷贝到新创的对象中去。)
2)直接初始化:不使用等号初始化对象
当初始值只有一个值时直接初始化拷贝初始化都行。如果初始化多个值,一般来说只能使用直接初始化的方式
例如: string s1="zxk"; //拷贝初始化
string s2=string(10,'c'); //拷贝初始化 虽然使用拷贝初始化达到了初始化多个值,但显 //然没有任何补偿的优势,且可读性较差
string s3("zxk"); //直接初始化
string s4(10,'c'); //直接初始化(按照所给字符重复若干次)
2.string对象上的操作
1)读写string对象(不含空格)
我们知道,使用标准库中的iostream来读写int double等内置类型的值。同样,也可以使用IO操作符读写string对象:
//只写main函数中的内容
int main()
{
string s;
cin>>s;
cout<<s<<endl;
return 0;
}
读写未知数量的string对象:
int main()
{
string word;
while(cin>>word) //当非法输入或遇到文件结束标记时结束循环
cout<<word<<endl;
return 0;
}
2).使用getline读取一整行(保留空白字符)
int main()
{
string line;
while(getline(cin,line)) //getline返回它的流参数line中不包含换行符,使用endl刷新显示缓冲区(防
cout<<line<<endl;//止发生错误时出错位置错误判断
return 0;
}
3).string的empty和size操作
顾名思义,empty函数用来判断string对象是否为空,返回一个布尔类型的值
if(!line.empty())
size函数返回string对象的长度
if(line.size()>80)
4).string::size_type类型
对于size函数返回一个string::size_type类型的值(由此可知,size_type是在string类中定义的),是一个无符号类型的值,而且做够放下任意string对象的大小。
新c++标准,允许编译器通过auto或者decltype来推断变量的类型:
auto len=line.size(); //len的类型是string::size_type
注意:如果表达式中已经有了size()函数就不要用int了,这样可以避免混用int和unsigned可能带来的问题。
5).比较对象(== !=)(这里就不做多余的解说了)
6).为string对象赋值
string st1(10,'c'),st2; //st1的内容是c(10个)st2是一个空字符串
st1=st2; //赋值,用st2的副本替换st1的内容,此时st1和st2都是空字符串
7).两个string对象相加
两个string对象相加得到一个新的string对象,其内容是把左侧的运算对象与右侧的运算对象相连起来
例如:
string s1="hello, ",s2="world\n";
string s3=s1+s2; //内容是hello,world\n
8).字面值和string对象相加
讲重点:标准库允许把字面值和字符串字面量(由于某些历史原因,也为了兼容c语言,所以c++语言中的字符串字面值并不是标准库类型string的对象,切记字符串字面值(字符字面值也是)与string不同的类型)转换成string对象,所以在需要string对象的地方可以使用这两种字面值来替换。当把string对象和字符字面值及字符串字面值混在一起使用时,必须确保每个加法运算符两侧的对象至少有一个是string:
string s1=s2+’+'; //正确
string s3="hello"+"," ;//错误
string s4=s5+","+"world"; //正确,先计算前面一部分,得到string对象
3.处理string对象中的字符(cctype头文件中的函数)
1).处理每个字符(使用基于范围的for语句)
新c++标准提供的一种语句:范围for(range for)语句.这种语句遍历给定序列的每个元素,并对序列中的每个值执行某种操作,其语法形式为:
for(declaration : expression) //declaration部分负责定义一个变量,该变量将被用于访问序列 statement //中的基础元素,expression部分是一个对象,用于表示一个序列。
例如:输出字符串中的字符
string str("some string");
for(auto c: str) //每行输出一个str中的一个字符,每进行一个循环都会输出一个字符
cout<<c<<endl;
例如:使用范围for语句改变字符串中的字符
如果想要改变字符串中字符的值,必须把循环变量定义成引用类型。
string s("Hello World...");
for(auto &c : c); //对于s中每一个字符(注意c是引用)
c=toupper(c); //c为引用,此时赋值语句将改变s中字符的值
cout<<s<<endl; //toupper函数为标准库函数,用来接受一个字符,输出其大写形式
2).处理部分字符
想要处理string对象中的单个字符有两种方式:一种是使用下标,另外一种是使用迭代器(这里不做介绍)
下表运算符([])接受的输入参数是string::size_type类型的值,这个参数要访问的字符的位置返回值是该位置上字符的引用(string对象下表必须大于等于0小于s.size(),超过范围讲出现不可预知的结果)
if(!s.empty()) //确定有这个字符
cout<<s[0]<<endl; //输出字符
既然返回引用,换言之可以对字符进行写操作
string s("some string");
if(!s.empty())
s[0]=toupper(s[0]);
和使用内置数组一样,在 合法(不越界)的范围内,可使用下标法对对象中的字符随机访问