C++ Tutorials: C++ Language: Compound data types: Character sequences

"本文详细介绍了C++中的字符串处理,包括string类和C风格的以空结束的字符序列(C字符串)。C++中的string类提供了一种强大且方便的方式来操作字符串,而C字符串则是以空字符''结尾的字符数组。文中通过示例展示了如何初始化、赋值和转换这两种字符串形式,并强调了它们在cin和cout操作中的互换性。此外,还提到了固定大小的字符数组与动态大小的string之间的区别。"
摘要由CSDN通过智能技术生成

C++官方参考链接:Character sequences - C++ Tutorials (cplusplus.com)

字符序列
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的char元素数组。 
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword[] = "Hello"; 
在这两种情况下,字符数组myword都声明为6个char类型的元素:5个字符组成单词"Hello",加上最后一个空字符('\0'),它指定序列的结束;在第二种情况下,当使用双引号(")时,空字符被自动追加。
请注意,这里我们讨论的是在声明字符数组时初始化它,而不是稍后为它们赋值(一旦它们已经声明了)。事实上,因为字符串字面量是普通数组,它们有与这些相同的限制,不能被赋值。
表达式(一旦myword已经像上面那样声明),例如:
myword = "Bye";
myword[] = "Bye";
将是无效的,就像两者都不是一样:
myword = { 'B', 'y', 'e', '\0' };
这是因为数组不能被赋值。但是请注意,它的每个元素都可以单独分配一个值。例如,这是正确的:
myword[0] = 'B';
myword[1] = 'y';
myword[2] = 'e';
myword[3] = '\0'; 

string和以空结束的字符序列
带有以空结尾的字符序列的普通数组是C语言中用来表示字符串的典型类型(这就是它们又被称为C字符串的原因)。在C++中,尽管标准库为字符串定义了特定的类型(类string),但以空结尾的字符序列(C字符串)的普通数组仍然是该语言中表示字符串的一种自然方式;事实上,字符串字面量仍然总是产生以空结束的字符序列,而不是string对象。
在标准库中,字符串的两种表示(C字符串和库string)同时存在,大多数需要字符串的函数都要重载以支持这两种表示。
例如,cin和cout直接支持以空结束的序列,允许它们直接从cin中提取或插入到cout中,就像标准string一样。例如:
// 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;

在本例中,使用了以空结束的序列和string组成的字符数组。它们与cin和cout一起使用时是可以互换的,但是它们的声明有一个显著的区别:数组有固定的大小,在声明时需要隐式或显式地指定;question1的大小正好是20个字符(包括结束的空字符),answer1的大小是80个字符;虽然标准string只是string,但没有指定大小。这是因为string的动态大小是在运行时确定的,而数组的大小是在编译时确定的,在程序运行之前。
在任何情况下,以空结束的字符序列和字符串很容易相互转换: 
以空结束的字符序列可以隐式转换为string,而string可以通过使用string的成员函数c_str或data转换为以空结束的字符序列:

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 
(注意:string的c_str和data成员是等价的) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值