+4

Multiple Null Characters in String Literal

For some reason, multiple null ('\0') characters stored in a std::string variable does not reflect when calling length method. std::string str = "\0\0\0"; std::cout << str.length(); // prints 0 but using a different way of building the string: std::string var = std::string(3,'\0'); std::cout << var.length(); // prints 3 Why is this so?

4/8/2019 5:45:59 AM

Fermi

13 Answers

New Answer

+5

C strings are null-terminated and C++ strings aren't. In your fist example, you are implicitly casting a `char*`-type string literal to a `std::string`, and, because in a C string, '\0' is considered end-of-string, it won't read any further. But you can still put \0 in a C++ string if you want to, which is what you are doing in the second example.

+3

In C++ string literals are actually of type "const char*" not char* there is difference between the two. C compiler is happy with char*

+3

Ah I googled and it said in C it's a char* but modifying the contents is UB. I figured it was the same in C++, thanks for clarifying.

+2

You mean string literals are actually char*, and char*, or string literals in itself, does not store null characters? ... this is just weird, but looks like you are right. It won't even read "\0something". As long as it meets \0, it cuts off. I'd figure that C++ wouldn't interfere with my explicit bidding, but I guess std::string(3, '\0') will work for me.

+2

String literals are char* yeah, but a char* does in fact store the '\0'. The problem is that a char* has no concept of "length" and so you either have to keep track of the length yourself (std::string), or you just keep on reading until you encounter a special value in memory (\0 in C "strings"). When converting between the two you have to be careful. One cool thing you can do with C strings is that you can store many strings in a single char*, by inserting \0s in between. That's what the C function `strtok` does for example!

+2

Fermi For reading something like "\0something" you can use escspe characters or use C++ raw string string str = R"(\0somethi'\0'ng)"

+2

px16 The example in the last line of my comment, is it different than what you have used in your example? And try this "\\0something" normal string with escape character the output will be \0something

+1

@swim Thanks for the tip on raw strings! Very handy!

+1

The first line implicit construct a std::string by detecting length of "\0\0\0", and copy the string into it. The length detection is something like strlen("\0\0\0"), which is same as strlen("\0"), so it construct a zero length std:: string. While the 2nd std:: string is constructed with explicit length.

+1

~ swim ~ Have you tried your suggestion? https://code.sololearn.com/ccYMAiBkNaoS/?ref=app

+1

Fermi If you want to store string literal with null characters in string, you may use: string str("\0something", 9); It is 4th constructor: https://en.cppreference.com/w/cpp/string/basic_string/basic_string Check it in my code. https://code.sololearn.com/cQXsLBx3lLBS/?ref=app

0

px16 Yes i have and it works fine. What issue are you facing?

0

~ swim ~ Raw string cannot contain null character. Your escape sequence "\0" inside raw string are in fact two characters: '\' and '0'. Check it in my code: https://code.sololearn.com/ccYMAiBkNaoS/?ref=app