我正在通过遗留代码修复问题,并发现以下列方式检查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;
}
}
输出是 -
字符串说我是空的
答案 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。