C++: strcmp being ignored

C++: strcmp being ignored

本文关键字:ignored being strcmp C++      更新时间:2023-10-16

我正在尝试编写一些代码来检测某个图像并播放声音。在我的源中,我使用 ImageGetName 来获取图像本身的名称。

ImageGetName 如下所示:

const char *ImageGetName(const image_c *image)
{
    const image_c *rim;
    rim = (const image_c *) image;
    return rim->name;
}

在我的主函数中,我定义了这个:

const char *image = ImageGetName(mo->subsector->sector->floor.image);

它应该在调用时将 *image 指向 floor.image,并根据需要对它们进行排序。

现在,我想做的是访问当前图像名称

ImageGetName(mo->subsector->sector->floor.image). 

所以要做到这一点,我假设我必须使用 strcmp。但也许我做得不正确。有问题的块:

            if (mo->player && gravity > 0 && -zmove > OOF_SPEED && ! fly_or_swim)
        {
            if(!strcmp(image, "WATER")) //false, do no lookup
            {
            CON_Message("Normal Floor!");
            mo->player->deltaviewheight = zmove / 8.0f;
            S_StartFX(mo->info->oof_sound, P_MobjGetSfxCategory(mo), mo);
            }
            else if(strcmp(image, "WATER") == 0) //true, look this up!!
            CON_Message("Detected WATER FLAT!");
            mo->player->deltaviewheight = zmove / 10.0f;
            S_StartFX(mo->info->secretsound, P_MobjGetSfxCategory(mo), mo);
        }

所以这里的问题是它完全忽略了第一个strcmp if(!strcmp(image, "WATER"((,而直接转到第二个:else if(strcmp(image, "WATER"( == 0(。它不应该这样做。在大多数情况下,除非玩家实际踩到WATER图像,否则它应该评估第一部分为真实。

问题是玩家实际上并没有踩到标有"WATER"的图像,而是玩家踩到的每个图像都会产生第二个输出(检测到水!

我需要它来评估访问的图像 - 如果找不到,则为"正常楼层",如果找到,则为"检测到水!

使用 !strcmp

应该假设它甚至不需要费心查看图像,而正常的 strcmp 应该评估正在踩踏的图像。但这并没有发生。

我可以在这里得到一些帮助吗?我真的很感激!

修复您的缩进,您的一个问题变得清晰:

if(!strcmp(image, "WATER")) //false, do no lookup
{
    CON_Message("Normal Floor!");
    mo->player->deltaviewheight = zmove / 8.0f;
    S_StartFX(mo->info->oof_sound, P_MobjGetSfxCategory(mo), mo);
}
else if(strcmp(image, "WATER") == 0) //true, look this up!!
    CON_Message("Detected WATER FLAT!");
mo->player->deltaviewheight = zmove / 10.0f;
S_StartFX(mo->info->secretsound, P_MobjGetSfxCategory(mo), mo);

最后两行不是else if块的一部分。您需要用大括号将要位于else if块中的语句括起来。

另一个问题是!strcmp(image, "WATER")strcmp(image, "WATER") == 0做完全相同的事情——要么它们都是真的,要么它们都是假的。我不知道你在那里想做什么,但这不是它实际做的事情。

1-您缺少一对围绕else if块的大括号

2-无论如何else if永远不会执行。 如果存在匹配项,strcmp 返回 0,这等效于 false。因此,假设存在匹配项,则if()内部的条件将计算为!0,该条件的计算结果为true。在 if 条件下,else if (condition)的计算结果为 else if (0==0) which is also equal to true. Remove the !",应该没问题。

我想如果

条件相同,则 if 和 else。我真的不明白你要在那里做什么,因为答案之一反映了。您能就此提供更多意见吗?

就像如果失败时,所有其他如果正在查找,如果它们也失败,它将进入 else 条件。如果错了,请纠正我。对你来说,这两个条件是一样的。

如果 (!0( == 真,如果 (0 == 0( == 真

在这里,玩家的两个条件也与水检测所描述的相同。

在游戏中,我觉得最好使用 strcmpi(( 而不是 strcmp((。但是,这不会为您提供两个条件相同的解决方案。