首页 > 解决方案 > 为什么字符串文字可能不是字符串?

问题描述

我在 C 标准中关于字符串文字的这一部分苦苦挣扎,尤其是它的第二部分:

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


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

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

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


要查看参考的第 7.1.1 节,关于“字符串”的定义,说明:

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

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

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

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

我现在完全是空白。


注意:我知道字符串文字存储在只读内存中并且不能修改,并且字符串是由 NUL 终止的字符序列的通用术语,它可以是可变的,也可以不是可变的。

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

我的问题是:

并且,根据我的担忧,到目前为止:


我想自己问这个问题,但在发布之前不久,我得到了线索。我的困惑是因为引文中的一些错位的措辞。

但我决定不删除问题的草稿,因为它可能对未来的读者有用,而是提供问答。

随意评论和提示。


相关资料:

标签: cstringnulllanguage-lawyerstring-literals

解决方案


你想多了。

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

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

表示“字符串”只能延伸到第一个空字符。在 null 之后可能存在的字符不是字符串的一部分。然而

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

清楚地表明字符串文字可能包含嵌入的空值。如果是这样,则字符串文字AS A WHOLE不是字符串——字符串只是字符串文字的前缀,直到第一个 null


推荐阅读