现在的位置: 首页 > 综合 > 正文

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

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

<!--[if !vml]-->http://www.cplusplus.com/doc/files/10-imgstri1.gif<!--[endif]-->

因此,在这个数组中在理论上我们可以存储一个最多包含20个字符的字符序列。但是我们也可以存更短的序列。例如,jenny可以在一个程序中的某处存储序列“Hello”或序列“Merry Chrismas”,因为它们两个都少于20个字符。

因此,由于字符数组可以存储少于其总长度的序列,一个特殊的字符别用来标示有效序列的结束:“空字符”(null character),它在字面上被写为’/0’(反斜杠,零)。

我们的有20char型元素的叫做jenny的数组存储字符序列“Hello”和“Merry Christmas”可以表述如下:

<!--[if !vml]-->http://www.cplusplus.com/doc/files/10-imgstri2.gif<!--[endif]-->

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

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

 cout << greeting << yourname << "!";

 return 0;
}

Please, enter your first name: John
Hello, John!
就像你看到的,我们声明了3个字符数组。前两个被用字符串常量初始化,而第三个没有被初始化。在任何情况下,我们都必须指明数组的大小:头两个(questiongreeting)的大小是根据初始化它们的字符串常量来定义的。而对于yourname我们则进行了显式的说明:它的大小是80char
最后,存储在数组中的字符序列能够和容易的通过赋值运算符转换成string对象:
string mystring;
char myntcs[]="some text";
mystring = myntcs;
 

 

抱歉!评论已关闭.