c_str()== NULL不起作用

时间:2011-10-13 22:08:41

标签: c++

我正在通过遗留代码修复问题,并发现以下列方式检查c_str不起作用。但是,如果我将比较更改为string.empty()则可行。所以我的问题解决了,但我不确定为什么c_str比较不起作用。任何想法为什么?
谢谢!
我正在使用 - gcc版本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;
  } 
 }

输出是 -
        字符串说我是空的

5 个答案:

答案 0 :(得分:4)

在这种情况下,

a不为空。字符串对象有一个内部指针,它不是null,而指针就是c_str返回的内容。

要验证这一点,请尝试

printf("%zu\n", a.c_str());

你会得到一个真实的地址。

答案 1 :(得分:4)

空终止字符串永远不会NULL,它总是指向带有空终止符的有效内存。空字符串只是一个\0。由于c_str()签约以返回以空字符结尾的字符串,因此它永远不会返回NULL。测试空字符串的正确方法确实是empty()

答案 2 :(得分:1)

猜测,对于一个空字符串,.c_str()可能会将非NULL字符串返回到某个内存,第一个字节设置为'\ 0'。 IOW,你得到一个零长度的字符串,而不是一个空指针。

答案 3 :(得分:1)

""不是空字符串,它是一个空字符串。在内存中,它将包含单个字符\0。另一方面,空字符串不包含任何字符:它甚至不指向任何字符。两种完全不同的“空”类型,其中只有一种是你测试的。

答案 4 :(得分:1)

std :: string不需要使用NULL来存储空字符串。

另一方面,c_str()需要将指针返回到以null结尾的字符序列。此序列的最小内存大小为1('\ 0'所需的内存大小)。所以它不能是NULL。

检查std :: string是否为空的正确方法是调用empty()方法。

您可能还会注意到以下代码:

char a[] = "";

变量 a 不是NULL。