C++ c#u str()vs std::string-what';这段小代码的真正区别是什么?

C++ c#u str()vs std::string-what';这段小代码的真正区别是什么?,c++,string,c++11,std,string-comparison,C++,String,C++11,Std,String Comparison,为什么下面的代码显示“否” #包括 #包括 #包括 #包括 void main() { const std::string abc=“hello”; 如果(abc.c_str()=“你好”) { coutabc.c_str()是指向abc对象的内部缓冲区的指针,然后与返回false的字符串文本“hello”进行指针比较 “hello”应解释为const char*或std::string,两者均有效 否。“hello”从不被解释为std::string。它的类型为const char[6],在本

为什么下面的代码显示“否”

#包括
#包括
#包括
#包括
void main()
{
const std::string abc=“hello”;
如果(abc.c_str()=“你好”)
{
cout
abc.c_str()
是指向
abc
对象的内部缓冲区的指针,然后与返回
false
的字符串文本“hello”进行指针比较

“hello”应解释为const char*或std::string,两者均有效

否。
“hello”
从不被解释为
std::string
。它的类型为
const char[6]
,在本例中转换为
const char*
。数组的这种转换称为衰减

但为什么不打印“是”

比较两个指针时,比较它们是否指向同一对象。使用的指针比较不相等,因为字符串文字和
std::string
的缓冲区不是同一对象

这是一个编译器错误吗

不,这是你代码中的一个错误

那么,您认为使用c_str()和std::string的正确方法是什么呢

正确的方法是比较以null结尾的字符数组的内容是
std::strcmp


或者,您可以直接将比较运算符用于
std::string
,而不使用
c_str
返回的指针。
std::string
的比较运算符与以null结尾的字符串的内容进行比较。

这不是编译器错误。
abc.c_str()
为您提供指向
std::string
数据缓冲区的指针值,由于C++11,它不可能与文本
“hello”
的地址相同,因为该标准禁止
std::string
的写时复制语义。(出于兴趣,我相信这在C++03及更早版本中理论上是可能的。)

如果要将文字与
std::string
进行比较,请使用

if(abc==“你好”)


由于
std::string
==
运算符有一个适当的重载。

如果比较的方式不对,请尝试:

而不是:

if (abc.c_str() == "hello")
使用:


为什么你认为它应该说“是”?你知道这里比较的是什么吗?
abc.c_str()==“hello”
比较指针。常量字符串
“hello”
与分配的堆不在同一地址
abc.c_str()
,因此,不,这不是一个编译器错误。是的,我误解了这一点。我知道这是在比较缓冲区指针和文本,并且它们在这一点上都没有指向同一个内存位置。谢谢!谢谢,那么您认为使用c_str()和std::string的正确方法是什么?“您好”可以被视为字符串文字和“const char*”,不知何故,我发现您在这方面的答案不完整。谢谢!正确的方法是什么?要比较c样式字符串,请使用
strcmp
变体之一。要比较std::strings,请使用
运算符==
字符串文字“hello”存储在内存中与
abc
对象的内部缓冲区不同的位置。将指针与两者进行比较会返回false。这会清除它吗?谢谢。非常好!我仍然认为这在C++03中是可能的。我想请一位专家发表评论。@Bathsheba我对C++03了解得不够,无法否认这种可能性。从我的经验来看记得我读过,我想这是可能的。在编译器/库升级之前,这个编程错误可能会被忽略。为什么不干脆
如果(abc==“hello”
?也有可能:)
if (abc.c_str() == "hello")
if (!strcmp(abc.c_str(), "hello"))