标准库类型 string
- 标准库类型
string
表示可变长的字符序列。 - 使用
string
类型必须要包含头文件<string>
。 string
定义在命名空间std
中。
定义和初始化string对象
直接初始化和拷贝初始化
如果使用等号(==)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新建的对象中去。
如果不使用等号则执行的是直接初始化。
当初始值只有一个时,使用直接初始化或拷贝初始化都行,如果初始化要用用到的值由多个,一般来说只能使用直接初始化。
string s5 = "hiya"; //拷贝初始化
string s6("hiya"); //直接初始化
string s7(10,'c') //直接初始化
string对象上的操作
读写string对象
string s;
cin >> s; //将string对象读到s,遇到空白停止
cout << s << endl; //输出s
读入字符串时,string
对象会自动忽略开头的空白(即空格符、换行符、制表符)并从第一个真正的字符开始读起,直到遇到下一个空白符为止。
读取未知数量的 string
对象:
string word;
while (cin >> word) //反复读取,直到文件末尾或非法输入
cout << word << endl;
使用getline读取一整行
string line;
while (getline(cin,line))
cout << line << endl;
getline 函数的参数是一个输入流和一个string对象,函数从指定输入流中读入内容,直到遇到换行符为止(换行符也会被读进来),然后把所读的内存存到那个string对象中(不存换行符)。
string 的 empty 和 size 操作
empty
函数根据 string
对象是否为空返回一个对应的布尔值。
size
函数返回 string
对象的长度,也就是 string
对象包含的字符个数。
string::size_type 类型
size
函数返回的是 string::size_type
类型的值。
string::size_type
类型是一个无符号类型的值,而且能够存下任何 string
对象的大小。
如果一条表达式中已经有了 size
函数,就不要再使用int等带符号类型,避免混用有符号类型和无符号类型造成错误。
string 对象的比较
string
对象的比较是按照字典顺序的。- 两个
string
对象的长度不同,而且较短的string
对象的每个字符都与较长string
对象对应位置上的字符相同,则较短string
对象小于较长string
对象。 - 如果两个
string
对象在某些对应位置上不一致,则string
对象比较的结果其实就是string
对象中第一个相异字符串的比较结果。
两个string对象相加
两个 string
对象相加得到一个新的 string
对象,其内容是把左侧的原酸对象与右侧的运算对象串接而成。
字面值和string对象相加
当把 string
对象和字符字面值及字符串字面值混在一个语句使用时,必须确保每个加法运算符的两侧至少有一个是 string
。
string s4 = s1 + ","; //正确,把一个string对象和一个字面值相加
string s5 = "hello" + ","; //错误,两个运算对象都不是string
处理string对象中字符
注意:
C++标准兼容C语言标准库,C语言头文件形式为 name.h
,C++则将这些文件命名为cname
,也就是去掉了 .h
后缀。
一般来说,C++程序应该使用 cname
的头文件,而不使用 name.h
的形式。
使用基于范围for语句处理每个字符
范围 for
语句是C++11新标准提供的一种语句。
for (declaration : expression)
statement
expression
部分是一个对象,用于表示一个序列。declaration
部分定义一个变量,该变量用于访问序列中的基础元素,每次迭代,declaration
部分的变量会被初始化为expression
部分的下一个值。
使用范围for语句改变字符串中的字符
如果想改变 string
对象中的字符的值,必须把循环变量定义成引用类型。
string s("hello,world");
for (auto &c : s)
c = toupper(c);
只处理一部分字符
如果需要处理 string
对象中的每一个字符,使用范围 for
语句是一个不错的方法,但是如果只是想访问其中一个字符,或者访问多个字符但遇到某个条件就要停下来。若想访问 string
对象中单个字符有两种方法:
- 使用下标。
- 使用迭代器。
使用下标访问string对象
下标运算符接收的输入参数是 string::size_type
类型的值,这个参数表示要访问的字符位置;返回值是该位置上字符的引用。
string
对象的下标必须大于等于0而小于s.size()
。- 在访问指定字符之前,首先应该检查
string
对象是否为空。 - 使用下标执行迭代:
string s;
for (decltype(s.size())index = 0;index !=s.size();++index)