ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:67.66KB ,
资源ID:7353413      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7353413.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(1String的一些说明.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

1String的一些说明.docx

1、1String的一些说明String的一些说明1 定义和初始化String对象3.2 标准库string类型 string类型支持长度可变的字符串,C+标准库负责管理存储字符的相关内存,以及提供各种有用的操作。标准库string类型的目的就是满足对字符串的一般应用。与其它的标准库类型一样,用户程序要使用string类型对象,必须包含相关头文件。如果程序员提供合适的using声明,那么编写出来的程序将会变得简短一些:#include using std:string;3.2.1 定义和初始化String对象string标准库支持几个构造函数(2.2.3节)。构造函数是一个特殊成员函数,定义如何初

2、始化该类型的对象。表3-1列出了几个string类型常用的构造函数。当没有明确指定对象初始代式时,系统将使用默认构造函数(2.3.4节)。表3-1 几种初始化String对象的方式string s1; 默认构造函数,s1为空串string s2(s1); 将s2初始化为s1的一个副本string s3(value); 将s3初始化为一个字符串字面值副本string s4(n, c);将s4初始化为字符c的n个副本警告:标准库string类型和字符串字面值 因为历史原因以及为了与C语言兼容,字符串字面值与标准库string类型不是同一种类型。这一点很容易引起混乱,编程时一定要注意区分字符串字面值

3、和string数据类型的使用,这很重要。习题 习题3.2 什么是默认构造函数?习题3.3 列举出三种初始化String对象的方法。习题3.4 s和s2的值分别是什么? string s; int main() string s2; 2 String的读写3.2.2 String的读写我们已在第1章学习了用iostream标准库来读写内置类型的值,如int,double等。同样地,也可以用iostream和string标准库,使用标准输入输出操作符来读写string对象:/ Note: #include and using declarations must be added to compil

4、e this codeint main() string s; / empty string cin s; / read whitespace-separated string into s cout s s; / read whitespace-separated string into s从标准输入读取string,并将读入的串存储在s中。string类型的输入操作符:读取并忽略开头所有的空白字符(如空格,换行符,制表符)。读取字符直至再次遇到空白字符,读取终止。因此,如果输入到程序的是“ Hello World! ”(注意到开头和结尾的空格),则屏幕上将输出“Hello”,而不含任何空格

5、。输入和输出操作的行为与内置类型操作符基本类似。尤其是,这些操作符返回左操作数作为运算结果。因此,我们可以把多个读操作或多个写操作放在一起:string s1, s2;cin s1 s2; / read first input into s1, second into s2cout s1 s2 word) cout word endl; return 0;上例中,用输入操作符来读取string对象。该操作符返回所读的istream对象,并在读取结束后,作为while的判断条件。如果输入流是有效的,即还没到达文件尾且没遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出。如果到

6、达了文件尾,则跳出while循环。2. 用getline读取整行文本另外还有一个有用的string IO操作:getline。这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略行开头的换行符。只要getline遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。例如,重写前面那段

7、程序,把每行输出一个单词改为每次输出一行文本:int main() string line; / read line at time until end-of-file while (getline(cin, line) cout line endl; return 0;由于line不含换行符,若要逐行输出需要自行添加。照常,我们用endl来输出一个换行符并刷新输出缓冲区。注意由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。习题 习题3.5 编写程序实现从标准输入每次读入一行文本。然后改写程序,每次读入一个单词。习题3.6 解释string类型的输入操作符和get

8、line函数分别如何处理空白字符。3 string对象的操作3.2.3 string对象的操作表3-2列出了常用的string操作。表3-2 string操作1. string的size和empty操作string对象的长度指的是string对象中字符的个数,可以通过size操作获取:int main() string st(The expense of spiritn); cout The size of st is st.size() characters, including the newline endl; return 0;编译并运行这个程序,得到的结果为:The size of

9、The expense of spiritis 22 characters, including the newline了解string对象是否为空是有用的。一种方法是将size与0进行比较:if (st.size() = 0) / ok: empty本例中,程序员并不需要知道string对象中有多少个字符,只想知道size是否为0。用string的成员函数empty()可以更直接地回答这个问题:if (st.empty() / ok: emptyempty()成员函数将返回bool值(2.1节),如果string对象为空则返回true,否则返回false。2. string:size_typ

10、e类型从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数。但事实上,size操作返回的是string:size_type类型的值。我们需要对这种类型做一些解释。string类类型和许多其他库类型都定义了一些伙伴类型(companion types)。这些伙伴类型使得库类型的使用是机器无关的(machine-independent)。size_type就是这些伙伴类型中的一种。它定义为与unsigned型(unsigned int或unsigned long)具有相同的含义,而且可以保证足够大可存储任意string对象的长度。为了使用由string类型

11、定义的size_type类型,程序员必须加上作用域操作符来说明所使用的size_type类型是由string类定义的。任何存储string的size操作结果的变量必须为string:size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。虽然我们不知道string:size_type的确切类型,但可以知道它是unsigned型(2.1.1节)。对于任意一种给定的数据类型,它的unsigned型所能表示的最大正数值比对应的signed要大一倍。这个事实表明size_type存储的string长度是int所能存储的两倍。使用int变量的另一个问题是,有些机器上int变量的表

12、示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就会超过这个数字。因此,为了避免溢出,保存一个string对象size的最安全的方法就是使用标准库类型string: size_type。3. string关系操作符string类定义了几种关系操作符用来比较两个string值的大小。这些操作符实际上是比较每个string对象的字符。string对象比较运算是区分大小写的,即同一个字符的大小写形式被认为是两个不同的字符。在多数计算机上,大写的字母位于小写字母之

13、前:任何一个大写字母都小于任意的小写字母。=操作符比较两个string对象,如果它们相等,则返回true。两个string对象相等是指它们的长度相同,且含有相同的字符。标准库还定义了!=操作符来测试两个string对象是否不等。关系操作符,=分别用于测试一个string对象是否小于、小于或等于、大于、大于或等于另一个string对象:string big = big, small = small;string s1 = big; / s1 is a copy of bigif (big = small) / false / .if (big = s1) / true, theyre equal

14、, so big is less than or equal to s1 / .关系操作符比较两个string对象时采用了和(大小敏感的)字典排序相同的策略:如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的string对象。如果两个string对象的字符不同,则比较第一个不匹配的字符。举例来说,给定string对象:string substr = Hello;string phrase = Hello World;string slang = Hiya;则substr小于phrase,而slang则大于substr或

15、phrase。4. string对象的赋值总体上说,标准库类型尽量设计得和基本数据类型一样方便易用。因此,大多数库类型支持赋值操作。对string对象来说,可以把一个string对象赋值给另一个string对象:/ st1 is an empty string, st2 is a copy of the literalstring st1, st2 = The expense of spirit;st1 = st2; / replace st1 by a copy of st2赋值操作后,st1就包含了st2串所有字符的一个副本。大多数string库类型的赋值等操作的实现都会遇到一些效率上的问

16、题,但值得注意的是,从概念上讲,赋值操作确实需要的工作。它必须先把st1占用的相关内存释放掉,然后再分配给st1足够存放st2副本的内存空间,最后把st2中的所有字符复制到新分配的内存空间。5. 两个string对象相加string对象的加法被定义为连接(concatenation)。也就是说,两个(或多个)string对象可以通过使用加操作符+或者复合赋值操作符+=(1.4.1节)连接起来。给定两个string对象:string s1(hello, );string s2(worldn);下面把两个string对象连接起来产生第三个string对象:string s3 = s1 + s2;

17、/ s3 is hello, worldn如果要把s2直接追加到s1的末尾,可以使用+=操作符:s1 += s2; / equivalent to s1 = s1 + s26. 和字符串字面值的连接上面的字符串对象s1和s2直接包含了标点符号。也可以通过将string对象和字符串字面值混合连接得到同样的结果:string s1(hello);string s2(world);string s3 = s1 + , + s2 + n;当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的:string s1 = hello; / no punct

18、uationstring s2 = world;string s3 = s1 + , ; / ok: adding a string and a literalstring s4 = hello + , ; / error: no string operandstring s5 = s1 + , + world; / ok: each + has string operandstring s6 = hello + , + s2; / error: cant add string literalsS3和s4的初始化只用了一个单独的操作。在这些例子中,很容易判断s3的初始化是合法的:把一个stri

19、ng对象和一个字符串字面值连接起来。而s4的初始化试图将两个字符串字面值相加,因此是非法的。s5的初始化方法显得有点不可思议,但这种用法和标准输入输出的串联效果是一样的(1.2节)。本例中,string标准库定义加操作返回一个string对象。这样,在对s5进行初始化时,子表达式s1 + , 将返回一个新string对象,后者再和字面值“worldn”连接。整个初始化过程可以改写为:string tmp = s1 + “, ”; / ok: + has a string operands5 = tmp + “world”; / ok: + has a string operand而s6的初始化

20、是非法的。依次来看每个子表达式,则第一个子表达式试图把两个字符串字面值连接起来。这是不允许的,因此这个语句是错误的。7. 从string对象获取字符string类型通过下标操作符()来访问string对象中的单个字符。下标操作符需要取一个size_type类型的值,来标明要访问字符的位置。这个下标中的值通常被称为“下标”或“索引(index)”。string对象的下标从0开始。如果s是一个string对象且s不空,则s0就是字符串的第一个字符,s1就表示第二个字符(如果有的话),而ss.size()-1则表示s的最后一个字符。引用下标超出下标作用范围就会引起溢出错误。可用下标操作符分别取出st

21、ring对象的每个字符,分行输出:string str(some string);for (string:size_type ix = 0; ix != str.size(); +ix) cout strix endl;每次通过循环,就从str对象中读取下一个字符,输出该字符并换行。8. 下标操作可用作左值前面说过,变量是左值(2.3.1节),且赋值操作的左操作数必须是左值。和变量一样,string对象的下标操作返回值也是左值。因此,下标操作可以放于赋值操作符的左边或右边。通过下面循环把str对象的每一个字符置为*:for (string:size_type ix = 0; ix != str

22、.size(); +ix) strix = *;9. 计算下标值任何可产生整型数值的表达式都可用作下标操作符的索引。例如,假设someval和someotherval是两个整型对象,可以这样写:strsomeotherval * someval = someval;虽然任何整型数值都可作为索引,但索引的实际数据类型却是unsigned类型string: size_type。前面讲过,要用string:size_type类型的变量接受size函数的返回值。在定义用作索引的变量时,出于同样的道理,string对象的索引变量最好也用string: size_type类型。在使用下标索引string对

23、象时,必须保证索引值“在上下界范围内”。“在上下界范围内”就是指索引值是一个赋值为size_type类型的值,其取值范围在0到string对象长度减1之间。使用string:size_type类型或其他unsigned类型作为索引,就可以保证索引值不小于0。只要索引值是unsigned类型,就只需要检测它是否小于string对象的长度。标准库不要求检查索引值,所用索引的下标越界是没有定义的,这样往往会导致严重的运行时错误。3.2.4 string对象中字符的处理我们经常要对string对象中的单个字符进行处理,例如,通常需要知道某个特殊字符是否为空白字符、字母或数字。表3-3列出了各种字符操作

24、函数,适用于string对象的字符(或其他任何char值)。这些函数都在cctype头文件中定义。表3-3 cctype定义的函数表3-3中的大部分函数是测试一个给定的字符是否符合条件,并返回一个int值作为真值。如果测试失败,则该函数返回0,否则返回一个(无意义的)非0值,表示被测字符符合条件。表中的这些函数,可输出的字符是指那些可以显式表示的字符。空白字符则是空格、制表符、垂直制表符、回车符、换行符和进纸符中的任意一种;标点符号则是除了数字、字母或(可输出的)空白字符(如空格)以外的其他字符。这里给出一个例子,运用这些函数输出一给定string对象中标点符号的个数:string s(Hel

25、lo World!);string:size_type punct_cnt = 0;/ count number of punctuation characters in sfor (string:size_type index = 0; index != s.size(); +index) if (ispunct(sindex) +punct_cnt;cout punct_cnt punctuation characters in s endl;这个程序的输出结果是:3 punctuation characters in Hello World!和返回真值的函数不同的是,tolower和to

26、upper函数返回的是字符,返回实参字符本身或返回该字符相应的大小写字符。我们可以用tolower函数把string对象s中的字母改为小写字母,程序如下:/ convert s to lowercasefor (string:size_type index = 0; index != s.size(); +index) sindex = tolower(sindex);cout s endl;得到的结果为:hello world!建议:采用C标准库头文件的C+版本 C+标准库除了定义了一些特定于C+的设施外,还包括C标准库。C+中的头文件cctype其实就是利用了C标准库函数,这些库函数就定义

27、在C标准库的ctype.h头文件中。C标准库头文件命名形式为name.h,而C+版本则命名为cname,少了后缀.h而在头文件名前加了c。c表示这个头文件源自C标准库。因此,cctype与ctype.h文件的内容是一样的,只是采用了更适合C+程序的形式。特别地,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。通常,C+程序中应采用cname这种头文件的版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。使用.h版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承来的,而哪些是C+所特有的。习题 习题3.7 编一程序读入两个string对象,测试它们是否相等。若不相等,则指出两个中哪个较大。接着,改写程序测试它们的长度是否相等,若不相等指出哪个较长。习题3.8 编一程序,从标准输入读取多个string对象,把它们连接起来存放到一个更大的string对

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1