C++字符串

字符串文本包含一个或多个封闭在双引 (") 内的源字符集的字符。 字符串文本表示字符序列,将这些字符合起来可组成以 NULL 结尾的字符串。

字符串文本可以含源字符集中除双引号(")、反斜杠 (\)、或者换行符以外的任何图形字符。 它们包含在 C++字符常数中描述的相同转义序列。

C++ 字符串具有这些类型:

  • 数组 char[“n”],其中“n”是字符串的长度(以字符)加上 1 的结果,该结果用于中止标记字符串尾端的 '\ 0 '

  • 用宽字符字符串的数组 wchar_t

修改字符串常数的结果未被定义。 例如:

char *szStr = "1234";
szStr[2] = 'A';      // Results undefined

Microsoft 专用

在某些情况下,相同的字符串文本可以 “合并”节省可执行文件的空间。 字符串文本合并,编译器导致特定字符串的所有引指向内存中同一位置,而不是每个引用指向一个单独的字符串文本实例。 /GF启用字符串池。

结束 Microsoft 专用

当指定字符串文本时,相邻字符串将串联在一起。 因此,此声明:

char szStr[] = "12" "34";

与此声明相同:

char szStr[] = "1234";

相邻字符串的此串联可以在多行中轻松地指定长字符串:

cout << "Four score and seven years "
        "ago, our forefathers brought forth "
        "upon this continent a new nation.";

在前面的示例中,整个字符串 Four score and seven years ago, our forefathers brought forth upon this continent a new nation. 一起拼接。 此字符串还可以指定使用行拼接如下所示:

cout << "Four score and seven years \
ago, our forefathers brought forth \
upon this continent a new nation.";

该常数内的所有相邻字符串串联后,追加 NULL 字符和 '\0' 从而为 C 字符串处理函数提供字符串尾标记。

当第一个字符串包含一个转义字符时,对字符串进行串联可能会产生令人惊讶的结果。 考虑以下两项声明:

char szStr1[] = "\01" "23";
char szStr2[] = "\0123";

尽管假定 szStr1 和 szStr2 包含相同的值很自然,但它们包含的实际值如下图所示。

转义和字符串串联

转义符和字符串连接

Microsoft 专用

字符串文本的最大长度为 16,384(16K) 字节。 此限制适用于类型 char[]wchar_t[] 的字符串。 但是,如果字符串包含用双引号括起来的部分,预处理器将这部分串联为一个单字符串,并且对于串联的每行,它都添加一个额外字节到总字节数。

例如,假设字符串由 40 行,每行 50 个字符(2,000 个字符)和具有 7 个字符的一行组成,并且,每行由双引号括起来。 添加 2,007 字节加上终止 Null 字符的 1 个字节,总共为 2,008 字节。 在连接,一个额外的字符被添加到字节的总数给首先的 40 行中的每一行。 这共有 2048 字节。 (多余字符未写入最终字符串。)但是,请注意,如果行延续 (\) 来代替使用双引号,预处理器不为每个行添加一个额外的字符。

结束 Microsoft 专用

通过计数字符数和终止'\0' 加 1 或 类型wchar_t加 2, 确定字符串对象的大小。

由于双引号 (") 包围了字符串,因此请使用转义序列 (\") 来表示封闭的双引号。 表示单引号 (') 可无需转义序列。 当放在行末端时,反斜杠字符 (\) 是行继续符。 如果要反斜杠字符在字符串中出现,则必须键入两个反斜杠 (\\)。 (有关行继续的更多信息,请参见在“预处理器引用”中的阶段转换。)

若要指定字符串类型宽字符 (wchar_t[]),请在开始双引号与该字符 L。 例如:

wchar_t wszStr[] = L"1a1g";

字符常数中列出的所有普通逆反代码在字符串常数中有效。。 例如:

cout << "First line\nSecond line";
cout << "Error! Take corrective action\a";

由于转义码在非十六进制数字的第一个字符内终止,因此为嵌入式十六进制转义码的字符串常数声明可能导致意外的结果。 以下示例旨在创建包含 ASCII 5 的字符串文本,后跟字符 five:

"\x05five"

实际结果是十六进制 5F,它是一个下划线的 ASCII 编码,后跟字符 ive。 上面的示例产生所要的结果:

"\005five"     // Use octal constant.
"\x05" "five"  // Use string splicing.

请参见

参考

C++文本