【问题标题】:Why are my if statements not working with strings in c++?为什么我的 if 语句不适用于 C++ 中的字符串?
【发布时间】:2018-08-08 18:56:34
【问题描述】:

我是 C++ 的新手,我尝试在谷歌上搜索解决方案,但我遇到的每个问题都与我面临的问题大相径庭,所以我无法弄清楚。我遇到的问题是当我从 powershell 运行 .exe 时,我的“if”语句被完全忽略了。

https://pastebin.com/aE6MiQig

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string q;
    string w;
    string Bob;
    string Emily;
    {
        cout << "Who is this? ";
        cin >> q;
        if (q == Bob)
        {
            cout << "Hey there bro. ";
        }
        if (q == Emily)
        {
            cout << "Hi friend :) ";
        }
        else
        {
            cout << "Oh hey " << q << ", how are you? ";
        }
        cin >> w;
        cout << "Hey, that's " << w;
    }
    return 0;
}

当我输入我的名字为“Bob”时,我应该会看到来自 if 语句的消息“Hey there bro”。但我看到的是 else 语句,“哦,嘿,鲍勃,你好吗?”。当我输入艾米丽时也是如此。只看到 else 语句。

我没有收到任何错误(在 Visual Studio 中运行)所以我在哪里搞砸了?

【问题讨论】:

  • 你在哪里设置BobEmily
  • 下次可能要使用调试器。
  • string Bob; 更改为 string Bob{"Bob"}; 看看会发生什么。
  • 您是否有意将 q 与文字字符串“Bob”和“Emily”进行比较?您的代码示例表明可能是这种情况,在这种情况下,您应该将它们写为字符串文字(例如“Bob”)。您拥有它们的方式是,它们是尚未分配任何值的空字符串变量。
  • Re,“如果你犯了错误,Visual Studio 不会给你警告和错误吗?”错误可以在许多不同的层面上犯。像 Visual Studio 这样的工具可以在您尝试运行程序之前找到并突出显示最简单的错误。 debugger 可以帮助您发现更深层次的错误,这些错误只有在您实际运行程序时才会变得明显,并且它并没有按照您的预期执行。

标签: c++ if-statement c++14


【解决方案1】:

为什么不直接比较字符串呢?

#include <iostream>
#include <string>

int main()
{
  std::string q;
  std::string w;
  std::cout << "Who is this? ";
  std::cin >> q;
  if (q == "Bob") // note the quotation marks around Bob
  {
      std::cout << "Hey there bro. " << std::endl;
  }
  else if (q == "Emily") // note the quotation marks around Emily
  {
      std::cout << "Hi friend :) " << std::endl;
  }
  else
  {
      std::cout << "Oh hey " << q << ", how are you? ";
      std::cin >> w;
      std::cout << "Hey, that's " << w << std::endl;
  }
  return 0;
}

另外,你应该避免using namespace std,因为它会导致namespace pollution。相反,您可以将 std:: 放在 stringcincoutendl 前面,就像我在上面所做的那样,或者专门为每个这些添加一个 using 语句,如下所示:

using std::string;
using std::cin;
using std::cout;
using std::endl;

【讨论】:

  • 这可能是 OP 真正想要做的。
【解决方案2】:

std::string 自带operator==,比较字符串的内容

string Bob;
string Emily;

好吧,现在您已经创建了两个字符串,都使用默认构造函数,因此它们都是 字符串(即它们都将等于 "")。

你需要给它们赋值:

string Bob("Emily");
string Emily("Bob");

我故意将它们分配给相反的!试试这段代码,你会发现自己是比较相关的内容,不是变量的名字...

【讨论】:

  • "我拼命地把它们分配给相反的!"你是不是说你“故意以相反的方式分配它们” ?我不得不多次重读这句话,才能掌握你的想法。
  • @AlgirdasPreidžius 哈哈,我自己已经发现了——不幸的是,在我纠正之前有人发现了它......对不起,英语不是我的母语,所以,虽然它是(希望??? ) 不是那么不好,有时...
  • 你的英语很好。
  • @Aconcagua 你的英语很好。这只是一点点,这让我感到困惑,我决定,我不妨分享一下。注意:英语不是大多数人的母语(例如,我也不是母语)。
  • 谢谢,伙计们...... @AlgirdasPreidžius 已经这么想了。但是无法找出 哪种 语言将 z 与 trema 一起使用。现在会很好奇...
【解决方案3】:

您从用户那里获得 string q 的值并将其与 string Emilystring Bob 进行比较,这两个都没有分配任何值。

我遇到的问题是,当我从 powershell 运行 .exe 时,我的“if”语句被完全忽略了。

您的if 语句不会被忽略,而是将string q 与“”进行比较。

你可以给string Bobstring Emily初始值:

#include <iostream>
#include <string>

int main()
{
  std::string Bob = "Bob";
  std::string Emily = "Emily";
  std::string q;
}

这样您就可以比较从cin 获得的值与:

#include <iostream>
#include <string>

int main()
{
  std::string Bob = "Bob";
  std::string Emily = "Emily";
  std::string q;

  std::cout<<"What is your name? ";
  std::cin>>q; //Obtain value from cin

  if(q == Emily){}//If q is Emily, then do something
}

您可以阅读更多关于默认变量值herehere.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多