I was going through legacy code to fix a problem and found out that checking c_str in the following manner does no开发者_StackOverflowt work. However if I change the comparison to string.empty() it works. So my problem is solved, but I am not sure why the c_str comparison does not work.Any idea why?
Thanks! I am using - gcc version 4.1.2 20080704 (Red Hat 4.1.2-46).#include <iostream>
using namespace std;
int main()
{
string a="";
if (a.c_str() == NULL)
{
cout <<"char says empty"<<endl;
}
if (a.empty())
{
cout << "string says empty"<<endl;
}
}
The output is-
string says I am emptya
is not null in this case. The string object has an internal pointer, which is not null
, and that pointer is what c_str returns.
To verify this, try
printf("%zu\n", a.c_str());
and you will get a real address.
A null terminated string is never NULL
, it always points to valid memory with a null terminator. The empty string is just a single \0
. Since c_str()
is contracted to return a null terminated string it can never return NULL
. The correct way to test for an empty string is indeed empty()
.
At a guess, with an empty string, .c_str()
is probably returning a non-NULL string to some memory, with the first byte set to '\0'. IOW, you're getting a zero-length string, not a null pointer.
std::string is not required to use NULL for storing empty strings.
On the other hand, c_str() is required to return a pointer to a null-terminated sequence of characters. The minimum memory size for this sequence is 1 (the required for the '\0'). So it cannot be NULL.
The right way to check if a std::string is empty is to call the empty() method.
You may also notice that on the following code:
char a[] = "";
The variable a is not NULL.
""
is not a null string, it is an empty string. In memory, it would contain a single character, \0
. A null string, on the other hand, contains no characters: it doesn't even point to anything. Two completely different types of "empty", only one of which you test for.
精彩评论