前言
标准库类型string表示可变长字符序列,使用之前需要包含string头文件,它定义在命名空间std中。
string初始化
1 | string s1 //默认初始化,s1是一个空串 |
其中string s4的初始化等价于下面的语句:1
2string temp(8,'a');
string s5 = temp;
如果使用=初始化一个变量,执行的是拷贝初始化编译器把等号右边的初始值拷贝到新创建的对象中,否则为直接初始化。
string操作
读写string
可以使用标准库中的iostream来读写string对象。
例如:1
2
3
4
5
6
7
8
9
using namespace std;
int main()
{
string s;
cin >> s;
cout<< s << endl;
return 0;
}
运行程序,在控制台输入: Hello world。
输入和输出结果如下:1
2 Hello world
Hello
可以看到,string对象会自动忽略开头的空白(空格符,换行符,制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白。
注意,string对象的输入输出操作会返回运算符左侧运算对象,并将其作为结果:1
cin >> s1 >> s2;
也就是说,对于上面的表达式,在运算cin >> s1之后,返回cin,继续运算cin >> s2。最终会将第一个输入读到s1,第二个输入读到s2中。
读取整行
整行读取可以使用getline函数,getline的读取会保留输入时的空白,遇到换行符才结束(换行符也被读取进来了)。遇到空行时,读取到的是空串。1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main()
{
string line;
if(getline(cin,line))
{
cout<< line;
cout<< line;
}
return 0;
}
输入输出结果:1
2HELLO
HELLO HELLO
可以看到:
- 空字符也被读取进来了
- 换行符没有存储在string中,line两次打印被打印在了同一行
字符串比较
比较s1和s2所含的字符是否完全一样,可以使用下面的方式:1
s1 == s2
string的大小比较是利用字符在字典序比较:1
2s1 > s2
s1 <= s2
判断string对象是否为空串
例如:1
s.empty() //返回布尔类型值
获取string对象长度
例如:1
s.size()
注意:这个表达式的返回值类型为string::size_type,它是一个无符号类型,因此避免用有符号类型,例如int来存储或者比较其长度。一个无符号数和一个负的有符号数比较大小时,有符号数会被转换为很大的无符号数,因此常常得到的结果就是这个无符号数小于这个负的有符号数。(可参考C语言入坑指南-整型的隐式转换和溢出)
字符串相加
有以下几种方式:1
2s1 + s2 //返回s1和s2的内容
s1 + “world” //返回s1和world的内容
注意:字符字面值和string对象使用+运算符时,两侧运算对象至少一个是string。
下面的操作是非法的:1
strings s = "hello" + "world";
字符串访问
要访问字符串中的字符,可直接使用下表运算符[],例如:1
2s[0] //访问s的第一个字符
s[s.size()-1] //访问s的最后一个字符
遍历字符串,可使用for each:1
2for(auto c : s) //遍历s中的字符,每个字符赋给c遍历
cout << c << endl; //打印c的值
同样也可以使用常规方式1
2
3unsignen int loop ;
for(loop = 0; loop < s.size();loop++)
cout << s[loop] << endl;
总结
- C++中的string是一个对象,但字符串字面值并不是一个string对象
- string的size函数返回值为无符号类型
- string对象的比较可用==等操作符,比较的是字符串内容是否相同
- 两个字符串字面值不能直接使用+操作符