Search code examples
c++string-literalsnull-pointer

cpp, "\0" == NULL returns false? How to figure it is null ptr or not?


I am getting these results. What am I doing wrong?

const char *c = "\0";
cout << (c == NULL); // false
cout << (c == nullptr); //false

Solution

  • All literal strings in C++ are really constant arrays of characters, including the null-terminator character.

    So doing e.g.

    const char* c = "\0";
    

    is somewhat equivalent to

    char const internal_string_array[] = { '\0', '\0' };
    const char* c = &internal_string_array[0];
    

    So a pointer to a literal string will never be a null pointer.

    Also there's a difference between a null pointer and the string null terminator character. A null pointer is a pointer which have been initialized to point to nowhere. A string null terminator character is the character '\0'. These two are different things.


    If you want to check to see if a C-style string (using pointers or arrays) is empty, then you first need to make sure it's not a null-pointer (if you're using pointers) and then check to see if the first character is the string null terminator character:

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

    For std::string objects (which you should use for almost all your strings) then you don't need the null-pointer check:

    if (str.empty())
    {
        // String is empty
    }
    else
    {
        // String is not empty
    }
    

    Also note that even if a string is not empty, it might contain unprintable characters (like the ASCII control characters), or characters that are "invisible" (like for example space or tab). So if printing the non-empty string it might not show anything.