3.2字符序列.docx_第1页
3.2字符序列.docx_第2页
3.2字符序列.docx_第3页
3.2字符序列.docx_第4页
3.2字符序列.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.2 字符序列 (Character Sequences)前面基础知识部分讲C+变量类型的时候,我们已经提到过C+的标准函数库提供了一个string类来支持对字符串的操作。然而,字符串实际就是一串连续的字符序列,所以我们也可以用简单的字符数组来表示它。例如,下面这个数组:char jenny 20; 是一个可以存储最多20个字符类型数据的数组。你可以把它想象成:理论上这数组可以存储长度为20的字符序列,但是它也可以存储比这短的字符序列,而且实际中常常如此。例如,jenny 在程序的某一点可以只存储字符串Hello 或者Merry christmas。因此,既然字符数组经常被用于存储短于其总长的字符串,就形成了一种习惯在字符串的有效内容的结尾处加一个空字符(null character)来表示字符结束,它的常量表示可写为0 或0。我们可以用下图表示jenny (一个长度为20的字符数组) 存储字符串Hello 和Merry Christmas : 注意在有效内容结尾是如何用空字符null character (0)来表示字符串结束的。 后面灰色的空格表示不确定数值。初始化以空字符结束的字符序列(Initialization of null-terminated character sequences)因为字符数组其实就是普通数组,它与数组遵守同样的规则。例如,如果我们想将数组初始化为指定数值,我们可以像初始化其它数组一样用:char mystring = H, e, l, l, o, 0 ; 在这里我们定义了一个有6个元素的字符数组,并将它初始化为字符串Hello 加一个空字符(null character 0)。除此之外,字符串还有另一个方法来进行初始化:用字符串常量。在前几章的例子中,字符串常量已经出现过多次,它们是由双引号引起来的一组字符来表示的,例如:the result is: 是一个字符串常量,我们在前面的例子中已经使用过。与表示单个字符常量的单引号()不同,双引号 ()是表示一串连续字符的常量。由双引号引起来的字符串末尾总是会被自动加上一个空字符 (0) 。因此,我们可以用下面两种方法的任何一种来初始化字符串mystring:char mystring = H, e, l, l, o, 0 ;char mystring = Hello; 在两种情况下字符串或数组mystring都被定义为6个字符长(元素类型为字符char):组成Hello的5个字符加上最后的空字符(0)。在第二种用双引号的情况下,空字符(0)是被自动加上的。注意:同时给数组赋多个值只有在数组初始化时,也就是在声明数组时,才是合法的。象下面代码现实的表达式都是错误的:mystring = Hello;mystring = Hello;mystring = H, e, l, l, o, 0 ; 因此记住:我们只有在数组初始化时才能够同时赋多个值给它。其原因在学习了指针(pointer)之后会比较容易理解,因为那时你会看到一个数组其实只是一个指向被分配的内存块的常量指针(constant pointer),数组自己不能够被赋予任何数值,但我们可以给数组中的每一个元素赋值。在数组初始化的时候是特殊情况,因为它不是一个赋值,虽然同样使用了等号(=) 。不管怎样,牢记前面标下画线的规则。给字符序列的赋值因为赋值运算的lvalue 只能是数组的一个元素,而不能是整个数组,所以,用以下方式将一个字符串赋给一个字符数组是合法的:mystring0 = H;mystring1 = e;mystring2 = l;mystring3 = l;mystring4 = o;mystring5 = 0; 但正如你可能想到的,这并不是一个实用的方法。通常给数组赋值,或更具体些,给字符序列赋值的方法是使用一些函数,例如strcpy。strcpy (string copy) 在函数库cstring (string.h) 中被定义,可以用以下方式被调用:strcpy (string1, string2); 这个函数将string2 中的内容拷贝给string1。string2 可以是一个数组,一个指针,或一个字符串常量constant string。因此用下面的代码可以将字符串常量Hello赋给mystring:strcpy (mystring, Hello); 例如: / setting value to string#include #include int main () char szMyName 20;strcpy (szMyName,J. Soulie);cout szMyName;return 0; J. Soulie 注意:我们需要包括头文件才能够使用函数strcpy。虽然我们通常可以写一个像下面setstring一样的简单程序来完成与cstring 中strcpy同样的操作: / setting value to string#include void setstring (char szOut , char szIn ) int n=0;do szOutn = szInn; while (szInn+ != 0);int main () char szMyName 20;setstring (szMyName,J. Soulie);cout szMyName;return 0; J. Soulie 另一个给数组赋值的常用方法是直接使用输入流(cin)。在这种情况下,字符序列的值是在程序运行时由用户输入的。当cin 被用来输入字符序列值时,它通常与函数getline 一起使用,方法如下:cin.getline ( char buffer, int length, char delimiter = n); 这里buffer 是用来存储输入的地址(例如一个数组名),length 是一个缓存buffer 的最大容量,而delimiter 是用来判断用户输入结束的字符,它的默认值(如果我们不写这个参数时)是换行符newline character (n)。下面的例子重复输出用户在键盘上的任何输入。这个例子简单的显示了如何使用cin.getline来输入字符串: / cin with strings#include int main () char mybuffer 100;cout Whats your name? ;cin.getline (mybuffer,100);cout Hello mybuffer .n;cout Which is your favourite team? ;cin.getline (mybuffer,100);cout I like mybuffer ) 来直接从标准输入设备接收数据。这个方法也同样可以被用来输入字符串,例如,在上面的例子中我们也可以用以下代码来读取用户输入:cin mybuffer; 这种方法也可以工作,但它有以下局限性是cin.getline所没有的: 它只能接收单独的词(而不能是完整的句子),因为这种方法以任何空白符为分隔符,包括空格spaces,跳跃符tabulators,换行符newlines和回车符arriage returns。 它不能给buffer指定容量,这使得程序不稳定,如果用户输入超出数组长度,输入信息会被丢失。 因此,建议在需要用cin来输入字符串时,使用cin.getline来代替cin 。字符串和其它数据类型的转换(Converting strings to other types)鉴于字符串可能包含其他数据类型的内容,例如数字,将字符串内容转换成数字型变量的功能会有用处。例如一个字符串的内容可能是1977,但这一个5个字符组成序列,并不容易转换为一个单独的整数。因此,函数库cstdlib (stdlib.h) 提供了3个有用的函数: atoi: 将字符串string 转换为整型int atol: 将字符串string 转换为长整型long atof: 将字符串string 转换为浮点型float 所有这些函数接受一个参数,返回一个指定类型的数据(int, long 或 float)。这三个函数与cin.getline 一起使用来获得用户输入的数值,比传统的cin 方法更可靠:/ cin and ato* functions#include #include int main () char mybuffer 100;float price;int quantity;cout Enter price: ;cin.getline (mybuffer,100);price = atof (mybuffer);cout Enter quantity: ;cin.getline (mybuffer,100);quantity = atoi (mybuffer);cout Total price: price*quantity;return 0;Enter price: 2.75Enter quantity: 21Total price: 57.75 字符串操作函数(Functions to manipulate strings)函数库cstring (string.h) 定义了许多可以像C语言类似的处理字符串的函数 (如前面已经解释过的函数strcpy)。这里再简单列举一些最常用的: strcat: char* strcat (char* dest, const char* src); /将字符串src 附加到字符串dest 的末尾,返回dest。 strcmp: int strcmp (const char* string1, const char* string2); /比较两个字符串st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论