!strcmp代替==

时间:2013-05-10 11:11:59

标签: c++ strcmp rapidxml

我正在使用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") )

哪个没有警告?

后者对我来说看起来很难看,但还有什么吗?

4 个答案:

答案 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"))