【问题标题】:C++ if statements using strings not working as intended使用字符串的 C++ if 语句未按预期工作
【发布时间】:2013-05-22 15:09:30
【问题描述】:

我已经搜索过这个错误,但似乎没有人和我遇到同样的问题。我正在尝试用 C++ 制作一个基于文本的基本 RPG 游戏来学习,我希望用户能够输入他们想要做的事情,例如,如果他们输入 ATTACK 他们会攻击怪物,但我的 if 语句:

if((current_move == "ATTACK") || (current_move == "attack"))

返回假!

下面是完整的功能:

while(monster_health > 0)
    {
        std::cin >> current_move;
        std::cout << current_move;
        if((current_move == "ATTACK") || (current_move == "attack"))
        {
            std::cout << "You attacked the monster!\n";

            double damage = return_level(xp) * 1.2;

            std::cout << "You did " << damage << " damage!\n";

            monster_health -= damage;
            if(monster_health < 0)
            {
                monster_health = 0;
                break_out = true;
            }
        }
        else if(current_move == "FLEE")
        {
            std::cout << "You ran away...\n";
            break_out = true;
        }
        else
        {
            std::cout << "Sorry, I didn't understand, what will you do? ATTACK or FLEE?\n";
        }
    }

我只是不断收到“对不起,我不明白”的消息;

请让我知道任何其他错误或不良做法,因为我才刚刚开始学习 :)

【问题讨论】:

  • 你能在current_move的声明中编辑吗?知道类型是什么很重要。
  • +1 @j883376。美元到甜甜圈,它们是 C 弦。
  • 上面已经声明过:char current_move [20];
  • @AdamTester 好了。
  • 如果您切换到使用std::string,您可以通过使用std::transform(current_move.begin(), current_move.end(), current_move.begin(), ::tolower);等将字符串转换为小写来简化比较

标签: c++ string if-statement


【解决方案1】:

current_move 的类型是什么?如果是char*(或char[]),那么您是在比较指针,而不是字符串。最好将std::string 用于current_move,然后与== 的比较将很直观。

您需要添加#include &lt;string&gt;。 (在 MSVC 中,字符串的某些部分没有它也可以工作,但它是非标准的并且会导致错误,例如在将字符串传递给 cout 时)。

【讨论】:

  • 考虑同样的事情,Oberon,因为如果该代码使用字符串类,则 if 语句应该评估为 true。看不到任何其他错误。
  • 当我这样做时,我得到如下错误:错误 1 ​​错误 C2679: 二进制 '>>' : 未找到采用 'std::string' 类型的右侧操作数的运算符(或者有没有可接受的转换)
  • @AdamTester 不要忘记#include &lt;string&gt;
【解决方案2】:

如果您使用的是 C 字符串 (char[]),则需要使用 strcmp() 进行比较。如果两个字符串相等,则返回 0。

if (strcmp(current_move, "ATTACK") == 0) 将在匹配时返回 true

【讨论】:

  • strcmp 为真时返回什么?
  • 可能实际上需要使用strcmpi,这是一个不区分大小写的比较,然后只做if (strcmpi(current_move, "ATTACK") == 0),当current_move为"attack"时返回0 , "AtTaCk" 或 "aTaCk" 或 ...,因此无需与所有大写字母或所有小写字母(或任何其他同样有效的大写字母排列)进行比较
【解决方案3】:

您需要执行 current_move==string("attack") 否则您将比较指针。字符串运算符 == 或 strncmp,任其一……

【讨论】:

    【解决方案4】:

    您的问题是您正在比较 C 字符串。当您对它们执行== 时,您正在比较两者的指针,这在此代码中是无用的。

    我的建议是将current_move 的类型更改为std::string,这样就可以了。然后你将比较内容,而不是指针。

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 2020-11-28
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多