25

我正在玩Pex,它传递给我的方法的参数之一是"\0".

这意味着什么?""我的猜测是基于我的方法内容的空字符串 ( )。但是,如果它是相同的,那么为什么不只使用""而不是"\0"呢?

有人知道这是什么吗?

4

6 回答 6

43

'\0' 是一个“空字符”。它用于在 C 和 C++ 的某些部分中终止字符串。Pex 正在测试您的代码如何处理空字符,可能是在寻找Poison Null Byte安全漏洞。

大多数 C# 代码无所畏惧;但是,如果您将字符串传递给非托管代码,则可能会遇到问题。

编辑:

明确地说... Pex 正在传递一个包含空字符的字符串。这不是空引用。

于 2010-02-18T22:56:10.483 回答
5

它是一个包含字符 '\0' 的字符串。C# 没有以任何特别的方式处理它——它只是 unicode 字符 U+0000。如果你写:

int firstCodePoint = text[0];

然后你会发现firstCodePoint是0。

于 2010-02-18T22:56:11.363 回答
5

它是一个带有空字符的字符串。较旧的字符串库(如 C 或较旧的 C++ 库中使用的那样)使用 '\0' 字符来指示字符串的结尾。

.Net 等较新的环境使用不同的系统,但有很多关于以 '\0' 结尾的字符串的历史,因此这是一个常见的错误点。像 Pex 这样的测试库将使用它来确保您的程序正确处理它。

于 2010-02-18T22:56:56.650 回答
3
Escape Sequence  
\0    
Character Name 
Null    
Unicode Encoding     
0x0000

请参阅此链接。

于 2013-08-01T13:00:41.787 回答
2

长度为 1 的字符串,包含字符 \u0000(又名 NUL)。这个字符没有被特殊对待。

在使用 \0 终止字符串的 C 中,您还分配了长度为 1 的字符串。在这种情况下,标准字符串函数将报告长度为 0,因为字符串包含 \0 并以它终止。您可以安全地修改 str[0],或将单个字符插入其中。

于 2010-02-18T22:57:12.873 回答
1

我刚刚找到了一个很好的例子,其中\0非常重要和必要。

假设我们要删除,以下代码中最后一个不需要的。

for (int i = 0; i < 5; i++)
{
    foreach (var a in "Money")
        Console.Write($"{a},");
}

在此处输入图像描述

如果我们只添加Console.Write("\b\n");如下,

for (int i = 0; i < 5; i++)
{
    foreach (var a in "Money")
        Console.Write($"{a},");
    Console.Write("\b\n");
}

输出将仍然相同。

但是如果我们添加\0如下,

for (int i = 0; i < 5; i++)
{
    foreach (var a in "Money")
        Console.Write($"{a},");
    Console.Write("\b\0\n");
} 

不需要的尾随,消失。

在此处输入图像描述

于 2020-06-30T07:56:40.870 回答