C++ primer: C++中string标准库类型
(C++ primer读书笔记)2013.3.18 zzy @B309
C++标准库提供string类型,支持长度可变的字符串。使用时要包含头文件string,还要对名字string做using声明。
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 阅读(273) 评论(0) 编辑 收藏 举报