常量字符* if() 与 "SRAD" 的比较返回 false



这是我的代码:

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。有人教育我为什么?谢谢。

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

您需要使用strcmp

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

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

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

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

或深入研究 C 库

#include <cstring>
if (std::strcmp(name, "SRAD") == 0)

如果你甚至这样写

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

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

因此,在此声明中

if("SRAD" == name)

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

您应该使用在标头 <string.h> 中声明的标准 C 函数strcmp。例如

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

最新更新