首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:忽略strcmp

C++:忽略strcmp
EN

Stack Overflow用户
提问于 2015-12-24 05:26:18
回答 3查看 141关注 0票数 0

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

ImageGetName如下:

代码语言:javascript
复制
const char *ImageGetName(const image_c *image)
{
    const image_c *rim;

    rim = (const image_c *) image;

    return rim->name;
}

在我的主要职能中,我有这样的定义:

代码语言:javascript
复制
const char *image = ImageGetName(mo->subsector->sector->floor.image);

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

现在,我要做的是使用

代码语言:javascript
复制
ImageGetName(mo->subsector->sector->floor.image). 

为了做到这一点,我想我必须使用strcmp。但也许我做得不对。所涉区块:

代码语言:javascript
复制
            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(图像,“水”)),然后右转到第二个:else if(strcmp(图像,“==”)== 0)。它不应该这样做。在大多数情况下,它应该评估第一部分是真实的,除非球员实际上踩水图像。

问题是,玩家实际上并不是踩到标记为“水”的图像,而是每一张图像都会产生第二个输出(检测到的水!)。

我需要它来评估被访问的图像--如果它找不到它,“普通地板”,如果它找到了,“探测到水!”

使用!strcmp应该假设它甚至不需要看图像,而普通的strcmp应该评估正在执行的图像。但这不会发生的。

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

EN

回答 3

Stack Overflow用户

发布于 2015-12-24 05:28:18

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

代码语言:javascript
复制
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做的事情完全一样--要么是真的,要么是假的。我不知道你在那里想做什么,但这不是它的实际作用。

票数 2
EN

Stack Overflow用户

发布于 2015-12-24 05:39:35

1-在else if块周围缺少一对大括号

无论怎样,else if都不会执行。如果有匹配的,则strcmp 返回0,这相当于false。因此,如果有匹配,则if()内部的条件将计算为!0,计算结果为真。在if条件下,else if (condition)的计算结果为else if (0==0) which is also equal to true. Remove the!‘,应该是可以的。

票数 1
EN

Stack Overflow用户

发布于 2015-12-24 09:41:10

如果条件相同的话,我想这两种情况都是一样的。我真的不明白你要在那里做什么,因为答案之一反映了这一点。你能提供更多的投入吗?

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

if (!0) == true和if (0 == 0) == true

在这里,这两个条件的播放器也是相同的,由水的检测。

在游戏中,我感觉更好地使用strcmpi()而不是strcmp().However,这不会在两个条件相同的情况下给出解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34447701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档