【问题标题】:const char* if() comparison with "SRAD" returns false [duplicate]const char* if() 与“SRAD”比较返回 false [重复]
【发布时间】:2015-02-17 10:21:30
【问题描述】:

这是我的代码:

const TiXmlAttribute* pAttr = pElem->FirstAttribute();
const char* name = pAttr->Name(); // attribute name
const char* value = pAttr->Value(); // attribute value
float _D = 0.0;

if("SRAD" == name)  // returns false here, but name is indeed "SRAD"
{
    _D = atof(value);
}

问题是名称是“SRAD”,但 if 条件返回 false。有人教我为什么吗?谢谢。

【问题讨论】:

  • 您正在比较指针。而是比较字符串。
  • 想在这里发布一些代码吗?
  • 没有。查一下。这是微不足道的,有两千万个重复。

标签: c++ string char


【解决方案1】:

这比较的是指针,而不是内容。

你需要使用strcmp:

if(strcmp("SRAD", name) == 0)

【讨论】:

  • 我会把你的作为答案,因为我可以设置名称和值相同的数据类型。
【解决方案2】:

您正在比较指针值,而不是字符串内容。指针(几乎可以肯定)不相等,即使字符串相等。

要么使用std::string,要么使用==和其他运算符比较字符串内容:

#include <string>

std::string name = pAttr->Name();
if("SRAD" == name) // works as expected

或深入研究 C 库

#include <cstring>

if (std::strcmp(name, "SRAD") == 0)

【讨论】:

  • 谢谢。 ----------------
【解决方案3】:

如果你甚至写如下方式

if ( "A" == "A" ) { /* do something */ }

条件的结果可以是真或假。问题在于,在这种情况下,具有数组 char[2] 类型的字符串文字被转换为指向其第一个元素的指针。并且编译器可以将相等的字符串文字存储在不同的内存范围中,也可以只存储相同字符串文字的一种表示形式。

因此在此声明中

if("SRAD" == name)

您正在比较字符串文字“SRAD”的第一个元素的地址和指针名称指向的数组的地址。

您应该使用标头&lt;string.h&gt; 中声明的标准C 函数strcmp。例如

if( strcmp( "SRAD", name ) == 0 ) /* ...*/;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多