我正在玩Pex,其传递给我的方法的参数之一是"\0"
。
这是什么意思?根据我的方法内容,我的猜测是一个空字符串(""
)。但是,如果它是相同的,那么为什么不使用""
代替"\0"
?
任何人都知道它是什么?
答案 0 :(得分:36)
'\ 0'是“null character”。它用于终止C和C ++的某些部分的字符串。 Pex正在测试你的代码如何处理null字符,可能正在寻找Poison Null Byte安全漏洞。
大多数C#代码都没有什么可担心的;但是,如果将字符串传递给非托管代码,则可能会出现问题。
修改强>
只是要明确...... Pex正在传递一个包含空字符的字符串。这是不空引用。
答案 1 :(得分:5)
这是一个包含字符'\ 0'的字符串。 C#不会以任何特别的方式对待它 - 它只是unicode字符U + 0000。如果你写:
int firstCodePoint = text[0];
然后你会发现firstCodePoint
为0。
答案 2 :(得分:3)
这是一个带有空字符的字符串。较旧的字符串库 - 与C或旧C ++库中使用的字符串库一样 - 使用'\ 0'字符表示字符串的结尾。
像.Net这样的新环境使用不同的系统,但是以'\ 0'结束字符串有很多历史,这是一个常见的错误点。像Pex这样的测试库将使用它来确保您的程序正确处理它。
答案 3 :(得分:2)
长度为1的字符串,包含字符\ u0000(又名NUL)。这个角色没有特别对待。
在C中,它使用\ 0来终止字符串,你还分配一个长度为1的字符串。在这种情况下,标准字符串函数将报告长度为0,因为字符串包含\ 0以及终止它。您可以安全地修改str [0],或者将单个字符strncat到其中。
答案 4 :(得分:2)
Escape Sequence
\0
Character Name
Null
Unicode Encoding
0x0000
答案 5 :(得分: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");
}
不需要的结尾,
消失了。