比较字符串 .c_str() 和普通字符串的差异

Difference in comparing string .c_str() and normal string

本文关键字:字符串 str 比较      更新时间:2023-10-16

我想知道这两个代码之间的区别是什么。当我使用 .c_str() 时它不起作用

std::vector<std::pair<std::string, std::string> >::iterator it
for(;it!=MySet.end();++it)
{
        if(std::get<1>(*it).c_str()=="PAUSE")  //Why it works only with std::get<1>(*it) and not with std::get<1>(*it).c_str()
        {
            TempDefaultVan = std::get<0>(*it).c_str();
        }
}
所以

基本上正在发生的事情是.c_str()返回一个const char*。这将导致operator ==比较指针,而不是字符串的内容。由于这两个显然都没有指向相同的内存位置(因为"PAUSE"是一个字符串文字),因此这始终是错误的。

std::get<1>(*it) 返回一个类型为 std::string 的对象。此类具有重载operator ==,用于将 std::string 类型的对象与字符数组进行比较。

std::get<1>(*it).c_str()返回一个字符数组。数组没有比较运算符。要比较字符数组,您应该使用标准 C 函数std::strcmp

所以你可以写

if( std::strcmp( std::get<1>(*it).c_str(), "PAUSE" ) == 0 )

如果你简单地写成

if(std::get<1>(*it).c_str()=="PAUSE")  

然后编译器将比较两个指针,因为它将数组转换为指向此类表达式中它们的第一个元素的指针。结果,如果数组占用不同的内存区域,则此表达式将始终等于 false。

此代码:

std::get<1>(*it).c_str()=="PAUSE"

是比较两个const char *,它们都指向字符串。这不是您在比较字符串时通常想要的,因为只有当它们指向内存中的同一位置时,它才会计算为 true。

此代码:

std::get<1>(*it)=="PAUSE"

将使用std::string::operator==std::string std::get<1>(*it)的内容与"PAUSE"的内容进行比较。如果你有两个char *值,你可以使用 strcmp ,但由于你有 std::string ,这是进行比较的最佳方式(正如您所说,"它有效")。