我正在使用rapidxml,所以我希望在代码中进行这样的比较:
if ( searchNode->first_attribute("name")->value() == "foo" )
这会发出以下警告:
comparison with string literal results in unspecified behaviour [-Waddress]
用它替换它是个好主意:
if ( !strcmp(searchNode->first_attribute("name")->value() , "foo") )
哪个没有警告?
后者对我来说看起来很难看,但还有什么吗?
答案 0 :(得分:4)
您通常不能使用==
比较C中的字符串,因为它只会比较第一个字符的地址而不是您想要的字符。
你必须使用strcmp()
,但我赞同这种风格:
if( strcmp(searchNode->first_attribute("name")->value(), "foo") == 0) { }
而不是使用!
,因为该运算符是布尔运算符而strcmp()
的返回值不是布尔值。我意识到它的工作原理并且定义明确,我只是觉得它很丑陋和迷茫。
当然你可以包装它:
#include <stdbool.h>
static bool first_attrib_name_is(const Node *node, const char *string)
{
return strcmp(node->first_attribute("name")->value(), string) == 0;
}
然后你的代码变得更加可口了:
if( first_attrib_name_is(searchNode, "foo") ) { }
注意:我使用bool
返回类型,这是C99的标准。
答案 1 :(得分:2)
如果value()
返回char*
或const char*
,您别无选择 - strcmp
或其中一个长度限制替代方案就是您所需要的。如果value()
可以更改为返回std::string
,则可以返回使用==
。
答案 2 :(得分:1)
将char *类型与&#34; ==&#34;进行比较时你只是比较指针。如果要与&#34; ==&#34;进行比较,请使用C ++字符串类型。
答案 3 :(得分:1)
您有几个选择:
您可以使用strcmp
,但我建议将其包装。 e.g。
bool equals(const char* a, const char* b) {
return strcmp(a, b) == 0;
}
然后你可以写:if (equals(searchNode->first_attribute("name")->value(), "foo"))
std::string
并使用==
运算符
if (std::string(searchNode->first_attribute("name")->value()) == "foo")
这将引入字符串复制操作,根据上下文,这可能是不合需要的。
<小时/> 您可以使用字符串引用类。字符串引用类的目的是提供一个类似于字符串的对象,该对象不拥有实际的字符串内容。我已经看过其中的一些,并且编写自己的内容很简单,但由于Boost有一个字符串引用类,我将使用它作为示例。
#include <boost/utility/string_ref.hpp>
using namespace boost;
if (string_ref(searchNode->first_attribute("name")->value()) == string_ref("foo"))