您的位置:首页 > 编程语言 > C语言/C++

C++语言指南(十二)——字符序列

2006-08-26 22:57 239 查看


 C++语言指南(十二)——字符序列

**************************************************************
原文链接:http://www.cplusplus.com/doc/tutorial/
**********************************************
[align=left]字符序列[/align]
[align=left]就像你可能已经知道了的那样,在C++标准库中实现了一个功能强大的string(字符串)类,它对控制和操作有字符组成的字符串非常有用。但是,因为字符串实际上是字符序列,我们也可以用普通的char型数组来保释它们。[/align]
[align=left]例如下面的数组:[/align]
[align=left]char jenny [20];[/align]
[align=left]是一个能最多存储20个char型元素的数组,它可以被表示为:[/align]
<!--[if !vml]-->

<!--[endif]-->
因此,在这个数组中在理论上我们可以存储一个最多包含20个字符的字符序列。但是我们也可以存更短的序列。例如,jenny可以在一个程序中的某处存储序列“Hello”或序列“Merry Chrismas”,因为它们两个都少于20个字符。
[align=left]因此,由于字符数组可以存储少于其总长度的序列,一个特殊的字符别用来标示有效序列的结束:“空字符”(null character),它在字面上被写为’/0’(反斜杠,零)。[/align]
我们的有20个char型元素的叫做jenny的数组存储字符序列“Hello”和“Merry Christmas”可以表述如下:
<!--[if !vml]-->

<!--[endif]-->
[align=left]注意怎样为了指示序列的结束在序列的末尾加入了null字符('/0’)。灰颜色的格表示char元素的值不确定。[/align]
[align=left]初始化以null结尾的序列[/align]
[align=left]因为字符数组是普通的数组,因此它们也遵守同普通数组相同的规则。例如,如果我们想用一些提前确定好的字符来初始化一个字符数组,我们可以就像对其它数组那样完成它:[/align]
[align=left]char myword[] = { 'H', 'e', 'l', 'l', 'o', '/0' }; [/align]
[align=left]在这种情况下我们就声明了一个有6个char型元素的数组,并且其被初始化为“Hello”并在结尾附加了一个null字符’/0’。但是字符数组由另一个初始化的方法:使用字符串。[/align]
[align=left]在前面章节我们已经使用的表达式中,表示全部字符串的常量已经出现了多次。它们都是被一对双引号(")括起来的文本。例如:[/align]
[align=left]"the result is: "[/align]
[align=left]就是以恶我们或许已经使用过的一个字符串常量。[/align]
[align=left]带双引号(")的字符串是字符串常量,它们的类型实际上是null结尾的字符数组。所以被双引号括起来的字符串常量通常在结尾被自动加入了一个null字符('/0’)[/align]
[align=left]因此我们可以用下面两种方法中的任意一种来给叫做myword的字符数组初始化为一个null结尾的序列:[/align]
[align=left]char myword [] = { 'H', 'e', 'l', 'l', 'o', '/0' };[/align]
[align=left]char myword [] = "Hello"; [/align]
[align=left]在这两种情况中,字符数组myword都被声明为了一个大小为6个char型元素的数组:其中5个对应单词“Hello”再加上一个标示序列结束的终止null字符('/0’),在第二种情况中,即使用了双引号("),null字符被自动添加。[/align]
[align=left]请注意:我们讨论的是在一个字符数组在它声明时被初始化的情形,而不是在它们已经被声明了之后给它们赋值。事实上因为null结尾的字符数组的类型是普通的数组,我们有和任何其它数组相同的限制,因此我们不能用一个赋值操作来拷贝数据块。[/align]
[align=left]假设mytext是一个char[]型变量,在一个源代码中的像这样的表达式:[/align]
[align=left]mystext = "Hello";[/align]
[align=left]mystext[] = "Hello"; [/align]
[align=left]将是无效的,像下面这个一样:[/align]
[align=left]mystext = { 'H', 'e', 'l', 'l', 'o', '/0' };[/align]
[align=left]这个原因可能在你有了一点更多的关于指针的知识后会更清楚,因为到那时就会很清晰:一个数组实际上是一个指向一个内存块的常量指针。[/align]
[align=left]使用以null结束的字符序列[/align]
[align=left]以null结尾的字符序列是在C++中处理字符串的普通方法,因此它们像在很多程序中那样使用。事实上,通常的字符串有这个类型(char[])也用于很多地方。[/align]
[align=left]例如,cin和cout支持以null结尾的序列为有效的字符序列的容器,因此它们可以被直接用于从cin中提取字符串或向cout中插入字符串。例如:[/align]
[align=left][/align]

[align=left]// null-terminated sequences of characters[/align]
[align=left]#include <iostream>[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]int main ()[/align]
[align=left]{[/align]
[align=left] char question[] = "Please, enter your first name: ";[/align]
[align=left] char greeting[] = "Hello, ";[/align]
[align=left] char yourname [80];[/align]
[align=left] cout << question;[/align]
[align=left] cin >> yourname;[/align]
 cout << greeting << yourname << "!";
[align=left] return 0;[/align]
[align=left]}[/align]

[align=left][/align]
[align=left]Please, enter your first name: John[/align]
[align=left]Hello, John![/align]
[align=left]就像你看到的,我们声明了3个字符数组。前两个被用字符串常量初始化,而第三个没有被初始化。在任何情况下,我们都必须指明数组的大小:头两个(question和greeting)的大小是根据初始化它们的字符串常量来定义的。而对于yourname我们则进行了显式的说明:它的大小是80个char。[/align]
[align=left]最后,存储在数组中的字符序列能够和容易的通过赋值运算符转换成string对象:[/align]
[align=left]string mystring;[/align]
[align=left]char myntcs[]="some text";[/align]
[align=left]mystring = myntcs;[/align]
[align=left] [/align]
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息