比较字符串.c_str()和普通字符串的区别

时间:2014-02-19 18:29:06

标签: c++

我想知道两个代码之间的区别是什么。当我使用.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();
        }
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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。

答案 2 :(得分:1)

此代码:

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

正在比较两个const char *,它们都指向字符串。这不是您在比较字符串时通常想要的,因为当它们指向内存中的相同位置时,它只会评估为真。

此代码:

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

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

相关问题