C++ 如果语句为 true,为什么我不能进入 if 条件?[已结束]

C++ Why can't I get into an if condition if the statement is true? [closed]

提问人:Swatheduru 提问时间:10/30/2022 更新时间:10/31/2022 访问量:83

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

去年关闭。

我在构造函数中创建了一个 for 循环,该循环遍历砖块的 XML 元素,并根据 Id 创建块。

我什至检查了 typeid,以防 mId 不是 char,而是 const char*。永不触发。代码如下:std::cout << "Made it in";

Brick::Brick(int rowSpacing, int columnSpacing, const char* Id, SDL_Renderer* renderer)
{
    mDoc = new XMLDocument();
    mDoc->LoadFile("Breakout.xml");

    // Go through every "BrickType" element in the XML file
    dataElement = mDoc->FirstChildElement("Level")->FirstChildElement("BrickTypes");

    for (XMLElement* brickElement = dataElement->FirstChildElement("BrickType");
        brickElement != NULL; brickElement = brickElement->NextSiblingElement())
    {
        std::cout << typeid(brickElement->FirstChildElement("Id")->GetText()).name();
        std::cout << typeid(Id).name();

        if (brickElement->FirstChildElement("Id")->GetText() == Id) {
            std::cout << "Made it in";

            mId = brickElement->FirstChildElement("Id")->GetText();

            std::stringstream hp(brickElement->FirstChildElement("HitPoints")->GetText());
            hp >> mHitPoints;

            std::stringstream bs(brickElement->FirstChildElement("BreakScore")->GetText());
            bs >> mBreakScore;

            mTexture = IMG_LoadTexture(renderer, brickElement->FirstChildElement("Texture")->GetText());            
        }
    }

    mCurrentHp = mHitPoints;

    mIsHit = false;

    rect = { rowSpacing, columnSpacing, mBrickWidth, mBrickHeight };
}

而不是我尝试硬编码“S”中的 Id,因为其中一个砖 Id 是“S”,就像这样,但它仍然不想进入 if 条件,我不明白为什么。if (brickElement->FirstChildElement("Id")->GetText() == Id)if (brickElement->FirstChildElement("Id")->GetText() == "S")

C++ IF语句 SDL-2 Tinyxml2

评论

7赞 Dan Mašek 10/30/2022
const char * GetText() const-- 您比较的是指针,而不是字符串。
1赞 Sven Nilsson 10/30/2022
要比较字符串,请使用类似 !strcmp(brickElement->FirstChildElement(“Id”)->GetText(), Id)
1赞 AndersK 10/31/2022
我建议不要在构造函数中发生这么多事情,恕我直言,最好将其拆分为几个函数以获得更多控制权。
1赞 tadman 10/31/2022
提示:在 C++ 中,首选 C 的无类型。nullptrNULL

答:

0赞 Clifford 10/31/2022 #1

C 字符串是字符数组,而不是 C++ 中的一类数据类型(恰好是 C(.因此,您不能对它们使用比较运算符。从语义上讲,您正在比较两个指针的值,而不是两个字符串的内容。

为此,您需要进行 C 字符串比较:

if( strcmp(brickElement->FirstChildElement("Id")->GetText(), 
           Id) == 0 ) ...

或使用 C++ 比较:std::string

if( std::string(brickElement->FirstChildElement("Id")->GetText()) ==
    std::string( Id ) ) ...

std::string 类重载运算符(和其他运算符),以便比较内容。构建一个只是为了进行比较有点重量级,但在其他情况下,无论如何,您最好优先使用 C 字符串。==std::stringstd::string