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

**************************************************************
原文链接:http://www.cplusplus.com/doc/tutorial/
**********************************************
字符序列
就像你可能已经知道了的那样,在 C++ 标准库中实现了一个功能强大的 string(字符串)类,它对控制和操作有字符组成的字符串非常有用。但是,因为字符串实际上是字符序列,我们也可以用普通的char型数组来保释它们。
<script type="text/javascript" src="http://ads.adbrite.com/mb/text_group.php?sid=170596&col=3&br=1"></script>

例如下面的数组:
char jenny [20];
是一个能最多存储 20 char 型元素的数组,它可以被表示为:

http://www.cplusplus.com/doc/files/10-imgstri1.gif

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

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

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

http://www.cplusplus.com/doc/files/10-imgstri2.gif

注意怎样为了指示序列的结束在序列的末尾加入了 null字符('/0’)。灰颜色的格表示char元素的值不确定。
初始化以null结尾的序列
因为字符数组是普通的数组,因此它们也遵守同普通数组相同的规则。例如,如果我们想用一些提前确定好的字符来初始化一个字符数组,我们可以就像对其它数组那样完成它:
char myword[] = { 'H' , 'e' , 'l' , 'l' , 'o' , '/0' };
在这种情况下我们就声明了一个有 6 char型元素的数组,并且其被初始化为“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[])也用于很多地方。
例如, cin cout 支持以 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;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值