C++定义了一个内容丰富的抽象数据类型库,其中,string和vector是两种最重要的标准库类型,前者支持可变长字符串,后者则表示可变长的集合。还有一种标准库类型是迭代器,它是string和vector的配套类型,常被用于访问string中的字符或vector中的元素。本篇将介绍string类型。
标注库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。
1.定义及初始化
string s1; //默认初始化,s1是空字符串
string s2=s1; //如果使用“=”初始化一个变量,实际上执行的是拷贝初始化。
string s3="hiya" //字符串字面值中除了最后那个空字符外其他所有的字符都被拷贝到新创建的string对象中去
string s4(10,'c') //直接初始化
2.string对象上的操作
(1).常用操作:
getline(is,s) //从is中读取一行赋给s,返回is
s.empet() //s为空返回true,否则返回false
s.size() //返回s中字符的个数;size返回的是一个string::size_type类型,他是string的一个配套类型
s[n] //返回s中第n个字符的引用,位置n从0记起
还有比如:s1+s2 ; s1=s2 ;s1==s2 ; s1<(<=)s2等等...<span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
(2).string对象的读取
iostream在读取string操作时,会自动忽略开头的空白并从第一个真正的字符读起,直到遇见下一个空白为止。可以利用while语句反复作读取操作。
int main()
{
string word;
while(cin>>word)
cout<<word<<endl;
return 0;
}
也可以使用getline函数读取一行。他的参数是一个输入流和一个string对象,从给定的输入流中读入内容,直到遇到换行符为止,然后把所读的内容存入到那个string对象中去。
(3).两个string对象相加
两个string对象相加,其内容结果是把左侧的运算对象与右侧的运算对象串接而成。标准库也允许把字面值和string对象相加,但是,当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符两侧的运算对象至少有一个是string。
(4).处理string对象中的字符
方法1:处理每个字符,使用基于范围的for语句,这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作:
语法形式:
for(declaration : expression)
statement
示例:输出string对象中的每个字符,每行一个。
string str("some string");
for(auto c : str)
cout<<c<<endl;
如果想要用范围for语句改变字符串中的字符,必须把循环变量定义成引用类型。
示例:
string s("Hello World");
for(auto &c : s)
c=toupper(c) //c是一个引用,因此赋值语句将改变s中字符的值,此处是将其变成大写
cout<<s<<endl; </span>
方法2:只处理一部分字符或者单个字符,
有两种方式:一种是使用下标,另外一种是使用迭代器。
下标运算符[ ]接收的输入参数类型是string::zise type类型,这个参数表示要访问的位置;返回值是给位置上字符的引用。string对象的下标是从0记起的。下标的值称为“索引”,任何表达式只要它的值是一个整型值就能作为索引,如果是带符号类型将自动转换成无符号类型。在访问指定字符之前,首先检查s是否为空。
示例:使用下标执行迭代
for(decltype(s.size())index=0;index !=s.size() && isspace(s[index]);++index)
s[index]=toupper(s[index]);
示例:使用下标执行随机访问-把0-15之间的十进制数转换成16进制数
const string hexdigits="0123456789ABCDEF";
cout<<"Enter a series of numbers between 0-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;
示例:使用迭代器把string对象的第一个字符改写为大写形式
string s("some string");
if(s.begin() != s.end())
{
auto it=s.begin();
*it=toupper(*it);
}