cpp, "\0" == NULL 返回 false?如何判断它是否为 null ptr?

lee*_*y00 -1 c++ string-literals null-pointer

我得到了这些结果。我究竟做错了什么?

const char *c = "\0";
cout << (c == NULL); // false
cout << (c == nullptr); //false
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 6

C++ 中的所有文字字符串实际上都是字符常量数组,包括空终止符。

这样做例如

const char* c = "\0";
Run Code Online (Sandbox Code Playgroud)

有点相当于

char const internal_string_array[] = { '\0', '\0' };
const char* c = &internal_string_array[0];
Run Code Online (Sandbox Code Playgroud)

因此,指向文字字符串的指针永远不会是空指针。

空指针和字符串空终止符之间也有区别。空指针是一个已被初始化为指向任何地方的指针。字符串空终止符是字符'\0'。这两个是不同的事情。


如果你想检查 C 风格的字符串(使用指针数组)是否为空,那么你首先需要确保它不是空指针(如果你使用指针),然后检查是否第一个字符是字符串空终止符:

if (c == nullptr)
{
    // No string at all!
}
else if (c[0] == '\0')
{
    // String exists, but is empty
}
else
{
    // String exists, and is not empty
}
Run Code Online (Sandbox Code Playgroud)

对于std::string对象(您应该将其用于几乎所有字符串),则不需要空指针检查:

if (str.empty())
{
    // String is empty
}
else
{
    // String is not empty
}
Run Code Online (Sandbox Code Playgroud)

另请注意,即使字符串不为空,它也可能包含不可打印的字符(如 ASCII 控制字符)或“不可见”字符(如空格或制表符)。因此,如果打印非空字符串,它可能不会显示任何内容。