符号\ 0在字符串文字中的含义是什么?

时间:2011-01-17 09:02:16

标签: c++ c string escaping string-literals

请考虑以下代码:

char str[] = "Hello\0";

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

7 个答案:

答案 0 :(得分:85)

sizeof str是“Hello”文本的7 - 5个字节,加上显式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 ++中也是禁止的。

答案 1 :(得分:10)

数组的长度为7,NUL字符\0仍然计为字符,字符串仍然以隐式\0

终止

请参阅this link查看工作示例

请注意,如果您将str声明为char str[6]= "Hello\0";,则长度将为6,因为只有在适合的情况下才会添加隐式NUL(在此示例中它不能。)

  

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

实施例

char str[] = "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[5]= "Hello\0"; /* sizeof == 5, str is "Hello" with no NUL (no longer a C-string, just an array of char). This may trigger compiler warning */
char str[6]= "Hello\0"; /* sizeof == 6, Explicit NUL only */
char str[7]= "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[8]= "Hello\0"; /* sizeof == 8, Explicit + two Implicit NUL */

答案 2 :(得分:5)

按照 JUST TRY IT 的常规鼓声独奏,以下是您将来如何回答类似的问题:

$ 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

......忽略不必要的部分......

.LC0:
    .string "Hello"
    .string ""

...

.LC1:
    .string "-->%s<--\n"

...

请注意我用于printf的字符串仅为"-->%s<---\n",而全局字符串分为两部分:"Hello"""。 GNU汇编程序也终止了带有隐式NUL字符的字符串,因此第一个字符串(.LC0)位于这两个部分的事实表明有两个NUL s。因此字符串长7个字节。通常,如果你真的想知道你的编译器在使用某些代码块时做了什么,请将它隔离在这样的虚拟示例中,并使用-S查看它正在做什么(对于GNU - MSVC也有一个标记用于汇编程序输出,但我不知道它的副手)。您将学到很多关于代码如何工作(或根据具体情况无法工作)的知识,并且您将得到快速得到的答案,100%保证与您正在使用的工具和环境相匹配。

答案 3 :(得分:5)

具体来说,我想提一个你可能会混淆的情况。

&#34; \ 0&#34;有什么区别?和&#34;&#34;?

答案是数组"\0"代表{0 0}""代表{0}

因为"\0"仍然是字符串文字,并且还会在其末尾添加"\0"""为空,但也添加了"\0"

了解这一点有助于您深入理解"\0"

答案 4 :(得分:3)

  

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

Let's find out:

int main() {
  char str[] = "Hello\0";
  int length = sizeof str / sizeof str[0];
  // "sizeof array" is the bytes for the whole array (must use a real array, not
  // a pointer), divide by "sizeof array[0]" (sometimes sizeof *array is used)
  // to get the number of items in the array
  printf("array length: %d\n", length);
  printf("last 3 bytes: %02x %02x %02x\n",
         str[length - 3], str[length - 2], str[length - 1]);
  return 0;
}

答案 5 :(得分:0)

char str[]= "Hello\0";

那将是7个字节。

在内存中应该是:

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

编辑:

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

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

  • ,它以多少个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

因此,您打印该char数组。然后,您想要一条新消息。比方说“你好”

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

注意str [5]上的00。这样,即使矢量和整个内容的实际经度不同,打印功能也将知道实际需要发送多少。

答案 6 :(得分:0)

'\0' 被称为 NULL 字符或 NULL 终止符 它是整数 0(零)的字符等价物,因为它不指代任何东西

在 C 语言中,它通常用于标记字符串的结尾。 示例字符串 a="砷"; 存储在数组中的每个字符

a[0]=A
a[1]=r
a[2]=s
a[3]=e
a[4]=n
a[5]=i
a[6]=c

数组末尾包含 ''\0' 以停止为字符串 'a' 分配数组内存。