标准库类型string
标准库类型string表示可边长的字符序列,作为标准库的一部分,string定义在命名空间std中。
1.定义和初始化string对象
- string s1; //默认初始化,s1是一个空字符串
- string s2=s1; //s2是s1的副本
- string s3 = "hello"; //s3是该字符串字面值的副本
- string s4(10 , 'c'); //s4的内容是 cccccccccc
直接初始化和拷贝初始化:如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化。例如像s4那样初始化要用到的值有多个,一般来说只能使用直接初始化的方式,若非要用拷贝初始化也行,不过需要显式地创建一个(临时)对象用于拷贝:
string s5 = string( 10 , 'c');
s5的初始值是string(10, 'c'), 它实际上是用数字10和字符c两个参数创建出来的一个string对象,然后这个string对象又拷贝给了s8。
2.string对象上的操作
一个类除了要规定初始化其对象的方式,还要定义对象上所能执行的操作。
- os<<s 将s写到输出流os中,返回os
- is>>s 从is中读取字符串赋给s,字符串以空白分隔,返回is
- getline(is, s) 从is中读取一行赋给s,返回is
- s.empty() s为空返回true,否则返回false
- s.size() 返回s中字符的个数
- s[n] 返回s中第n个字符的引用,位置从0计起
- s1+s2 返回s1和s2连接后的结果
- s1=s2 用s2的副本代替s1中原来的字符
- s1==s2
- s1!=s2
- <,<=,>,>= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感
读写string对象:针对下面这个程序,我们输入几组字符串看看输出
由此可见,string对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。
使用getline读取一整行:有时候我们希望最终得到的字符串保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。getline函数的参数是一个输入流和一个strinf对象,函数从给定的输入流中读取内容,直到遇到换行符为止(但这个换行符也会被读进来),然后把所读取到的内容存入string对象中(但是这个换行符不存进去)。getline只要遇到换行符就结束读取操作并返回结果(就是输入的第一个就是换行符也是如此,此时得到一个空string)。
string的empty和size操作:empty函数根据string对象是否为空返回一个对应的布尔值,empty是string的一个成员函数。size函数返回string对象的长度(sring对象中 字符个数)。
string::size_type类型 : 对于size函数来说,返回一个int或者unsigned似乎都是合情合理的,但事实上size函数返回的是一个string::size_type类型的值。在说明string::size_type是啥之前,我们先来介绍一下什么是配套类型,string类以及其他大多数标准库类型都定义了几种配套的类型,这些配套类型体现了标准库类型与机器无关的特性。类型size-type是其中一种,在具体使用的时候,通过作用域操作符来表明size_type是在类string中定义的。size_type是一个无符号类型的值而且足够存放下如何string对象的大小。由于size函数返回的是一个无符号整型数,因此在表达式中混用了带符号数和无符号数将可能产生意想不到的结果。
比较string对象:1.如果两个sring对象的长度不同,而且较短string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象。2.如果两个string对象在某些对应的位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果。
两个string对象相加:
字面值和string对象相加:
当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string。下面这个写法就是错误的:
string s = "hello" + " ," ;
3.处理string对象中的字符
在cctype头文件中定义了一组标准函数处理单个字符
处理每个字符:可以使用基于范围的for语句,该语句遍历给定序列中的每个元素并对序列中的每个值执行某些操作,例子如下:
其中“c”是一个变量,“str”是一个对象,每次迭代,str的下一个字符被拷贝给c,因此该循环可以读作“对于字符串str中的每个字符c”执行某某操作。