c_str == string与c_str == c_str的值相等
Value equality of c_str == string vs c_str == c_str
我正在尝试比较libpqxx c_str
值。
如果我尝试直接比较它们,例如result1[0][0].c_str() == result2[0][0].c_str()
,当它们具有相同的字符串值时,它们不会return true
。正确比较它们的唯一方法是使用strcmp
。
然而,如果我比较libpqxx的c_str
和strcmp
的std::string
,编译器抱怨strcmp
的参数不能是std::string
,但最奇怪的是:如果我比较result1[0][0].c_str() == some_std_string
这样的东西,如果它们具有相同的值,则比较return true
,否则比较false
。
为什么会这样?这是libpqxx特有的东西吗?如果不是,这是标准行为吗?
这是因为std::string
是一个类,而const char*
(c_str
返回的类型)是指针类型。如果指针指向相同的内存位置,比较指针返回true
。另一方面,类可以定义相等对它们意味着什么。
由于string
s和const char*
非常相似,string
类定义了一个比较字符串对象和const char*
指针的方法。它还定义了如何将char
指针转换为字符串。然而,这实际上是一条单行道,因为它没有定义如何使用操作符或隐式转换从字符串创建const char*
。这就是为什么你不能在它们上面使用strcmp
。
Strcmp
是C标准库中的一个函数。C没有类,类型不能像c++类那样定义基本行为。因此,C定义了一堆函数来处理char指针,而且只处理char指针。
char指针和字符串之间的这种不一致并不局限于相等。例如,std::string
支持与+
操作符的连接:这意味着string + string
、const char* + string
、string + const char*
可以工作,但const char* + const char*
会导致编译时错误,因为指针没有定义这种操作。
也用c_str()
吧!
if (strcmp(result1[0][0].c_str(), some_std_string.c_str()) == 0)
{
...
或使用std::string
的operator ==
if (result1[0][0].c_str() == some_std_string)
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- Python str to C++ to Python str
- 使用 std::string () const 函数启动线程或未来
- 使用char类型将decimal转换为string,将string转换为decimal
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 将向量解析<string>为字符串
- 在 c++ 中使用" for(string str: tmp) "?
- String & String::Concat(const char Str[])
- Boost.Python.ArgumentError:Python str未转换为std::string
- getline 的实现 ( istream&is, string&str )
- Why std::string str = {}?
- 为什么stringstream::str()截断string
- 使用 string.find() 确定第 i 个"str"的位置
- std::string 到 str::string.c_str() 与文件路径的转换中存在有趣的问题
- c++:以std::string (&str[0])作为缓冲区安全地读取文件
- Str.compare()或(string)A == (string)B用于字符串比较