字符序列

string类在前面的章节中已经作了简要介绍。这是一个非常强大的类来处理和操作字符的字符串。然而,由于字符串是,事实上,字符序列,我们也可以代表他们作为字符类型的元素的纯阵列。

例如,以下的数组:

 
char foo [20];
 


是,最多可存储类型的20元素的数组 char。它可以表示为:

 
因此,该阵列具有用于存储的最多20个字符的序列的容量。但这种能力并不需要完全耗尽:所述阵列还可以容纳较短序列。例如,在程序的某个时刻,或该序列 "Hello"或该序列 "Merry Christmas"可以存储在 foo,因为这两个将适合于一个序列与用于20个字符的容量。

的:按照惯例,在字符序列表示字符串的结束是由一个特殊的字符信号发送 空字符,其文字值可写成 '\0'(反斜杠,零)。

在这种情况下,类型的20个元素的阵列 char称为 foo可表示存储该字符序列 "Hello""Merry Christmas"为:

 
注意如何串本身的内容之后,一个空字符( '\0')已经为了指示序列的结束时加入。在灰色的空格表示 char未确定值的元素。

空值终止字符序列的初始化

由于字符数组都是普通阵列,它们遵循相同的规则,因为这些。例如,要初始化字符数组与字符的一些预定的顺序,我们可以做到这一点就像任何其他的阵列:

 
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; 
 


上述声明类型的6个元素的阵列 char与形成单词的字符初始化 "Hello"加上一个 空字符  '\0'结尾。

但字符元素的数组必须初始化另一种方法:使用 字符串直接。

在前面章节的一些例子使用的表达式,字符串已显示出了好几次。这些由封闭双引号之间的文本(指定 ")。例如:

 
"the result is: "
 


这是一个 字符串,可能在一些早期的例子中使用。

用双引号(字符序列 ")的 字面常量。而它们的类型,实际上,字符的空终止数组。这意味着字符串始终有一个空字符( '\0')在结束时自动追加。

因此,所谓的字符元素的数组 myword可以通过这两个语句中的任何一个字符的空值终止序列进行初始化:

1
2
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword[] = "Hello"; 
 


在这两种情况下,字符数组 myword被声明的尺寸型的6个元素的 char:将5个字符组成该字 "Hello",再加上一个最后空字符( '\0'),它指定序列的末尾,并且,在第二种情况下,使用双引号时,(  "),它会自动添加。

请注意,我们在这里讨论的是它被宣布的那一刻初始化字符数组,而不是后来将他们分配值(一旦他们已经声明)。事实上,由于字符串是正规的阵列,它们有相同的限制,因为这些,并不能分配值。

表达式(一旦myword已经声明如上述),如:

1
2
myword = "Bye";
myword[] = "Bye"; 
 


是有效的,像既不是:

 
myword = { 'B', 'y', 'e', '\0' };
 


这是因为阵列不能被分配的值。注意,虽然,它的每个元素可以单独分配一个值。例如,这将是正确的:

1
2
3
4
myword[0] = 'B';
myword[1] = 'y';
myword[2] = 'e';
myword[3] = '\0';
 


字符串和空值终止的字符序列

与字符的空值终止序列平原数组在C语言中用来表示字符串类型的典型(这就是为什么他们也被称为 C字符串)。在C ++中,尽管标准库定义字符串(类特定类型的 string),还是与字符(C字符串)的空值终止序列平原阵列代表在语言字符串的一种自然的方式; 事实上,字符串仍总是产生空值终止字符序列,而不是 string对象。

在标准库,字符串(C字符串和库字符串)两种表示并存,需要串大多数功能都是重载的同时支持。

例如, cin并且 cout支持直接空值终止序列,使他们能够从直接提取 cin或插入 cout,就像琴弦。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// strings and NTCS:
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  char question1[] = "What is your name? ";
  string question2 = "Where do you live? ";
  char answer1 [80];
  string answer2;
  cout << question1;
  cin >> answer1;
  cout << question2;
  cin >> answer2;
  cout << "Hello, " << answer1;
  cout << " from " << answer2 << "!\n";
  return 0;
}
你叫什么名字?荷马
你住在哪里?希腊
你好,从希腊荷马!


在本实施例中,使用利用空终止序列和字符串的字符的两个阵列。它们是在它们的使用相当可互换连同 cincout,但在它们的声明一个显着的区别:阵列具有固定的大小,需要声明当待指定的隐式或显式;  question1拥有大小正好20个字符(包括终止空字符),并 answer1有大小80个字符; 而字符串是简单的字符串,不指定大小。这是由于这样的事实,即串有在运行时确定的动态尺寸,而是在汇编确定数组的大小,该程序运行之前。

在任何情况下,空值终止的字符序列和字符串很容易相互转化:

空值终止字符序列可以隐式转换成字符串,字符串可以通过使用要么被转化为空值终止字符序列 string的成员函数 c_strdata

1
2
3
4
char myntcs[] = "some text";
string mystring = myntcs;  // convert c-string to string
cout << mystring;          // printed as a library string
cout << mystring.c_str();  // printed as a c-string 
 


(注:这两个 c_str data 的成员 string 是等同的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值