比较字符串 .c_str() 和普通字符串的差异
Difference in comparing string .c_str() and normal string
我想知道这两个代码之间的区别是什么。当我使用 .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
,这是进行比较的最佳方式(正如您所说,"它有效")。
相关文章:
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- std::smatch str() 未返回正确的字符串
- 使用 str.erase() 的索引擦除字符串的元素?
- 在字符串中查找确切的子str
- 在 ss.clear() 之后使用 ss.str( " ") 用于新定义的字符串流
- .Net字符串是否可以在不复制的情况下交给fn(const char16_t*str)
- 从"char"到"const char*"的转换无效 [-fpermissive] str::atoi (字符串到整数)
- 字符串流.str().cstr()有问题吗
- 字符串中的 cin>>str+1 是什么C++?
- 我是否负责释放/删除stringstream.str()返回的字符串
- 流的内容和返回的字符串“str()”之间的差异
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 使用 str.at(x) 将字符串转换为 int
- 将字符串转换为无符号字符 str
- 在字符串 c++(无子字符串)上使用 str.find() 时执行操作
- 为什么当我们反转此函数中的字符串时,char *str 的指针没有改变?
- 使用 c.str 从字符串转换为 cstring
- 有没有使用 str.substr( ) 在给定位置提取子字符串的替代方法
- 使用str()和rdbuf()打印字符串流
- 转换str字符串以用于std::getline分隔符的字符串