C++ 符号\0在字符串文字中是什么意思?

C++ 符号\0在字符串文字中是什么意思?,c++,c,string,escaping,string-literals,C++,C,String,Escaping,String Literals,考虑以下代码: char str[] = "Hello\0"; str数组的长度是多少,以0结尾?数组的长度是7,NUL字符\0仍然作为一个字符,字符串仍然以隐式\0结尾 请参阅以查看工作示例 请注意,您已将str声明为char str[6]=“Hello\0”长度将为6,因为隐式NUL只有在合适的情况下才被添加(在本例中它不能) §6.7.8/p14一系列 字符类型可以由 字符串文字(可选) 用大括号围起来的。成功的 字符串的字符数 文字(包括终止字符) 如果有空间或 数组大小未知) 初始化

考虑以下代码:

char str[] = "Hello\0";

str数组的长度是多少,以0结尾?

数组的长度是7,NUL字符
\0
仍然作为一个字符,字符串仍然以隐式
\0
结尾

请参阅以查看工作示例

请注意,您已将
str
声明为
char str[6]=“Hello\0”长度将为6,因为隐式NUL只有在合适的情况下才被添加(在本例中它不能)

§6.7.8/p14
一系列 字符类型可以由 字符串文字(可选) 用大括号围起来的。成功的 字符串的字符数 文字(包括终止字符) 如果有空间或 数组大小未知) 初始化数组的元素

例子
sizeof str
是7-5个字节的“Hello”文本,加上显式NUL终止符,再加上隐式NUL终止符

strlen(str)
是5-只有五个“Hello”字节

这里的关键是始终添加隐式nul终止符-即使字符串文字恰好以
\0
结尾。当然,
strlen
只是在第一个
\0
处停止-它无法分辨区别

隐式NUL终止符规则有一个例外-如果显式指定数组大小,字符串将被截断以适合:

char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL)
char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs)
char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)

但是,这很少有用,并且容易错误计算字符串长度并以未终止的字符串结束。它在C++中也是被禁止的。

< p>敲打我通常的鼓独奏的<强> >试一下< <强> >,下面是你如何回答这样的问题:

$ cat junk.c
#include <stdio.h>

char* string = "Hello\0";

int main(int argv, char** argc)
{
    printf("-->%s<--\n", string);
}
$ gcc -S junk.c
$ cat junk.s

.LC1:
.string”-->%s%s
str数组的长度是多少,它的结尾是多少个0


具体来说,我想提到一种情况,你可能会感到困惑

与“\0”有什么区别?

答案是
“\0”
在数组中表示的是
{0}
表示的是
{0}

因为
“\0”
仍然是字符串文字,它还将在其末尾添加
“\0”
。并且
为空,但也添加
“\0”

了解这一点将有助于您深入理解
“\0”

char str[]= "Hello\0";
这将是7个字节

在记忆中,应该是:

48 65 6C 6C 6F 00 00
H  e  l  l  o  \0 \0
编辑:

  • \0符号在C字符串中是什么意思?
    它是字符串的“结尾”。一个空字符。在内存中,它实际上是一个零。通常处理字符数组的函数会查找这个字符,因为这是消息的结尾。我将在结尾处给出一个示例

  • str数组的长度是多少?(在编辑部分之前回答)
    七,

  • 它将以多少0结束?
    数组有两个带零的“空格”;str[5]=str[6]='\0'=0

额外示例:
假设有一个函数可以打印该文本数组的内容。 您可以将其定义为:

char str[40];
现在,您可以更改该数组的内容(我不会详细介绍如何更改),使其包含消息:“这只是一个打印测试” 在内存中,您应该具有以下内容:

54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00
所以你打印了那个字符数组。然后你想要一条新消息。让我们说“你好”


请注意str[5]上的00。这就是print函数如何知道它实际需要发送多少,而不管向量和整个内容的实际经度。

字符串的长度(作为C函数查看字符串)是5。
sizeof
操作符返回7。@ChrisLutz:问题是“str数组的长度是多少”(我的重点)所以这个答案是正确的。“克里斯,好的,我承认,<代码> C <代码>白话在字符串的长度和大小上有不同的含义。在我的回答中,我指的是后者。这种截断只在C中有效,而不是在C++中。你的代码> char(8)。
示例似乎是错误的。如果OP使用了
char str[8]={'H','e','l','l','o','\0','\0};剩余字符的值将{u不是未定义的,它将是零(以便您可以合理地初始化,例如,
int-arr[100]={0}为全零)。我不明白
“Hello\0”为什么会有任何不同“
要比长格式的更有效,除非该标准明确对这种情况作了例外(这对我来说似乎很奇怪。)@Chris,是的,我大概是在你写回复时更新的:)顺便说一句,所讨论的段落:如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,聚合的其余部分应隐式初始化为具有静态存储持续时间的对象。仅供参考,null字符(也是null终止符),缩写为NUL,因此术语“NUL终止符”对我来说有点混淆。@Ashot Martirosyan:您还需要了解C吗,或者你只对C++的答案感兴趣吗?@ Charles Bailey,我主要使用C++,但是我当然想知道C和C++之间有什么区别。这就是为什么我添加C++标签。@ UMMAGUMMA,如果你只用C标记,那么只有C才可以回答。如果你用C和C++来标记它,你就限制了那些只能回答两种语言之间细微差别的人。只有当问题确实需要一定程度的知识和专业知识——理解两种语言之间的细微差异时,才应该使用两种语言来标记某件事。。。。除非我们正在测试的东西恰好是未定义的行为,否则在这种情况下,答案可能只能100%保证与工具和环境匹配
char str[]= "Hello\0";
48 65 6C 6C 6F 00 00
H  e  l  l  o  \0 \0
char str[40];
54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00
48 65 6c 6c 6f 00 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00