【问题标题】:Difference in comparing string .c_str() and normal string比较字符串 .c_str() 和普通字符串的区别
【发布时间】:2014-02-19 18:29:06
【问题描述】:

我想知道这两个代码之间的区别是什么。当我使用 .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() 您将指针与字符进行比较,而不是实际的字符序列。
  • c_str() 返回一个const char *,并且指针比较仅在点指向相同的内存位置时才为“真”(这不是你想要的)。您想比较内容。
  • @ferozakbar 这与data 无关,而是指针比较与字符串内容比较。
  • strcmp 用于字符串指针 (const char*) 比较。

标签: c++


【解决方案1】:

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

【讨论】:

  • -1:c_str() 不返回 char*。您的帖子中还有一些语法错误。
【解决方案2】:

std::get&lt;1&gt;(*it) 返回 std::string 类型的对象。此类具有重载 operator == 以将 std::string 类型的对象与字符数组进行比较。

std::get&lt;1&gt;(*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。

【讨论】:

  • strcpy 不正确.. 它不应该是以下之一:strcmp、stricmp、strcasecmp。
  • 另外,如果你有std::string,为什么还要麻烦strcmp?
  • @CantChooseUsernames C++ 标准中没有 stricmp 和 strcasecmp 这样的函数。它们是非标准函数。
  • @CantChooseUsernames 这是一个错字。:)
  • @VladfromMoscow:因为您无缘无故地获得了 C 字符串。使用std::string 为您提供的成员函数。
【解决方案3】:

这段代码:

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

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

这段代码:

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

将使用std::string::operator== 将std::string std::get&lt;1&gt;(*it) 的内容与"PAUSE" 的内容进行比较。如果您有两个 char * 值,则可以使用 strcmp,但由于您有一个 std::string,这是进行比较的最佳方法(并且,正如您所说,“它有效”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多