C++ primer: C++中string标准库类型

C++ primer读书笔记)2013.3.18 zzy @B309

 

C++标准库提供string类型,支持长度可变的字符串。使用时要包含头文件string,还要对名字stringusing声明。

1   #include <string>
2 
3   using std::string;

 

初始化:string标准库支持几个构造函数,在没有指明对象初始化式时,系统使用默认构造函数。

1   string s1;          默认构造函数,s1为空串
2 
3   string s2(s1);       将s2初始化为s1的一个副本
4 
5   string s3(“value”);  将s3初始化为一个字符串子面值的副本
6 
7   string s4(n, ‘c’);    将s4初始化为n个字符’c’构成的字符串

 

  输入输出:string对象用标准输入cin读,用标准输出cout写,下面是几种典型实践:

  1.用标准输入/输出操作符:>> and << 

1  string s;
2 
3   cin >> s;
4 
5   cout << s << endl;

输入操作符>>在读取string类型时:

·读取并忽略开头所有的空白字符(空格、换行符、制表符);

·读取字符直至再次遇到空白字符,读取终止。

 

  2.读入未知数目string对象:

1   string word;
2 
3   //read until end-of-file,writing each word to a new line.
4 
5   while(cin >> word)
6 
7       cout << word << endl;

 

  3.getline函数读取整行文本:

1   string line;
2 
3   //read line at time until end-of-file
4 
5   while(getline(cin, line))
6 
7       cout << line << endl;

 

 getline函数接受两个参数:一个输入流对象,一个string对象。getline一次读取一行,遇到换行符停止。行尾的换行符也会读取,但是换行符不会存入string对象中。getline不会忽略行开头的换行符,如果第一个字符就是换行符,那么getline函数也将停止读入并返回,此时string对象被置为空string

  测试下面两个完整的程序对行开头/结尾的空白字符(空格、制表符、换行符)的处理,特别是行开头处的换行符:

程序清单1

 1 #include<iostream>
 2 
 3 #include<string>
 4 
 5 // or use “using namespace std;” instead
 6 
 7 using std::cin;
 8 
 9 using std::cout;
10 
11 using std::endl;
12 
13 using std::string;
14 
15 int main()
16 
17 {
18 
19     string word;
20 
21     while(cin >> word)
22 
23         cout << "BEGIN-" << word << "-END" << endl;
24 
25     return 0;
26 
27 } 

程序清单2

 1 #include<iostream>
 2 
 3 #include<string>
 4 
 5 // or use “using namespace std;” instead
 6 
 7 using std::cin;
 8 
 9 using std::cout;
10 
11 using std::endl;
12 
13 using std::string;
14 
15 int main()
16 
17 {
18 
19 string line;
20 
21 while(getline(cin, line))
22 
23     cout << "BEGIN-" << line << "-END" << endl;
24 
25     return 0;
26 
27 } 

 

string对象的操作:

1.成员函数size() 返回string对象中字符的个数,返回类型为string::size_type(与unsigned具有相同含义)。

2.成员函数empty() 测试string对象是否为空,返回bool型。 

1   string s(“zzy@Library”);
2 
3   cout << s.size() << endl;
4 
5   if(s.empty())
6 
7       cout << “empty!” << emdl;

 

3.关系运算:==  !=  <  <=  >=  >,比较两个string对象的大小或相等关系,表达式返回的是bool类型。

  关系操作符比较两个string对象时采用了和(大小写敏感的)字典排序相同的策略:

  ·如果两个string对象长度相同,且对应字符相同,那么它们是相等的;

  ·如果两个string对象长度不同,且短的string对象是长的string对象的前缀,则短的string对象小;

  ·比较两个string对象出现的第一个不同的字符。

4.赋值操作

  可以把一个string对象赋值给另一个string对象,也可以把一个字符串字面值赋值给一个string对象

1   string s1,s2;
2 
3   s1 = “zzy @ Library”;
4 
5   s2 = s1;

5.string对象的加法被定义成连接。两个string对象可以通过’+’操作符或”+=”操作符连接成一个string对象。string对象还可以和字符串字面值连接,’+’操作符的两个操作数中至少有一个要是string对象,表达式返回一个string对象。

  ‘+’操作符两个操作数中有一个是string对象,另一个还可以是单个字符,或数字,数字按ASCII码转换成相应字符。

程序清单3

 1 #include<iostream>
 2 
 3 #include<string>
 4 
 5 //or use “using namespace std;” instead
 6 
 7 using std::cin;
 8 
 9 using std::cout;
10 
11 using std::endl;
12 
13 using std::string;
14 
15 int main()
16 
17 {
18 
19     string s1 = "zzy", s2 = " @ ", s3 = "Library!\n";
20 
21     string s4 = s1 + s2 + s3;
22 
23     cout << s4;
24 
25     string s5 = "IF " + s4 + "coding " + "ENDIF";
26 
27     cout << s5;
28 
29     return 0;
30 
31 }

 

6.string对象通过[ ]下标操作符访问每个元素,范围是0 - (size() - 1)C++标准库对访问越界不做检查。

 1     string s = "zzy @ Library4D";
 2 
 3     for(string::size_type i = 0; i != s.size(); ++i)
 4 
 5         cout << s[i];
 6 
 7     cout << endl;
 8 
 9  
10 
11     for(int i = -1; i <= 20; ++i)
12 
13         cout << s[i];
14 
15     cout << endl;
16 
17  
18 
19     for(int i = 0; i < s.size(); ++i)
20 
21         s[i] = '$';
22 
23    cout << s << endl;

 

 

posted on 2013-03-18 21:38  Lattexiaoyu  阅读(278)  评论(0编辑  收藏  举报

导航