c_str()返回值与const char*不匹配

c_str() return value not matching const char*

本文关键字:const char 不匹配 返回值 str      更新时间:2023-10-16

c_str()返回一个const char*,我假设下面的代码打印"equal",但它没有。

有人能解释一下我错在哪里吗?

string xx = "hello";
const char* same = "hello";
const char* buf = xx.c_str();
if (buf == same)
{
    cout << "equal" << endl;
}

我假设以下代码打印"相等"

这是一个错误的假设。std::string将文字数据复制到其内部缓冲区,因此指针会有所不同。

如果您想比较数据而不是指针,那么根本不要使用c_str(),而是直接比较const char*string-重载的比较运算符会按照您的期望进行操作。

operator==对于const char*不进行字符串比较,而是直接比较指针。xx使用的缓冲区与same指针不同,因此它们不相等。

要使用std::stringconst char*进行字符串比较,只需使用std::string:提供的运算符

if (xx == same)
{
    cout << "equal" << endl;
}

Operator == for char*指针比较指针本身,而不是它们指向的字符串。

如果您想再次猜测std::string,您需要使用比较例程,如以下所示:

if (strncmp(buf, same, xx.size())
...

buf == same不是比较字符串,而是比较指针的地址。由于它们是两个不同的变量,因此它们将具有两个不相等的不同地址。如果需要比较char* s或const char* s,则可以使用std::strcmp

您正在比较两个指针的值,这两个指针永远不会相等。same指向只读存储器,c_str返回的指针是std::string对象的当前数据缓冲区,并保证附加一个null终止符。

可以写入xx == same:这是因为std::string用适当的数据类型重载==。或者,也许不那么优雅,您可以在两个指针上使用std::strcmp