为什么字符串文字不是字符串?

问题描述 投票:0回答:1

我在C标准中关于字符串文字的这一部分感到苦恼,特别是它的第二部分:

在翻译阶段7中,一个或多个字符串文字产生的每个多字节字符序列都附加一个零值的字节或代码。80)


80)字符串文字可能不是字符串(请参见7.1.1),因为可以通过\0转义序列将空字符嵌入其中。

来源:ISO / IEC 9899:2018(C18),§6.5.1/ 6,第51页

我听不懂解释-“ 因为可以通过\0转义序列将空字符嵌入其中。”。


要查看参考的第7.1.1节中有关“字符串”的定义,声明如下:

字符串是一个连续的字符序列,由第一个空字符终止,包括第一个空字符。

来源:ISO / IEC 9899:2018(C18),§7.1.1/ 1,第132页

我考虑过,焦点可能放在“ can”上,这样一来,字符串文字不必包含/嵌入空字符,而需要包含字符串。

但是我又问自己:如果字符串文字中没有以字符串结尾的空字符,该如何使用它来确定字符串的结尾(字符串操作函数需要) ?

我现在完全在画空白。


Note:我知道字符串文字存储在只读存储器中并且不能修改,字符串是NUL终止的一系列字符的通用术语,可以或可以不可改变。

因此,我的问题不是:“ 字符串和字符串文字之间有什么区别?

我的问题是:

  • 为什么/怎么不能将字符串当作字符串?

并且,根据我的关注,到目前为止:

  • 是真的,字符串文字可以省略NUL字节吗?

我本人想问这个问题,但是在发布之前不久,我就知道了。我之所以感到困惑,是因为报价内的措词错位。

但是我决定不删除问题的草稿,因为它可能对将来的读者有用,并提供一个问答环节。

随时发表评论和暗示。


相关内容:

c string null language-lawyer string-literals
1个回答
0
投票
让我们看一下C18§6.5.1/ 3中同一部分的术语“

字符串文字”的定义。

字符串文字是用双引号括起来的零个或多个多字节字符的序列,例如"xyz"

因此,字符串文字仅由引号内的字符(裸字符串内容)组成。它没有附加的\0。如第6.5.1 / 6节中所述,NUL字节稍后在转换时附加:

在翻译阶段7中,一个或多个字符串文字产生的每个多字节字符序列都附加一个零值的字节或代码。80)


让我们举例:

"foo"

字符串文字,但不是字符串

,因为"foo"不包含embedded空字符。
"foo\0"

字符串文字

string,因为文字本身在字符序列的末尾包含一个空字符。
请注意,您无需在

字符串文字

的末尾显式插入空字符即可将其更改为字符串。如前所述,它在程序翻译过程中被隐式附加。 表示,

const char *s = "foo";

等于

const char *s = "foo\0";


我承认,这句话:

字符串文字可能不是字符串(请参见7.1.1),因为可以通过\0转义序列将空字符嵌入其中。

在上下文中有点混乱和不合逻辑。最好用这样的措辞:

字符串文字可能不是字符串(请参见7.1.1),因为\0会在其中嵌入空字符可能不是

(或不是必需)转义序列。
或替代:

字符串文字可能not

是字符串(请参见7.1.1),因为可以通过\0转义序列将空字符嵌入其中。”
© www.soinside.com 2019 - 2024. All rights reserved.