【问题标题】:How do I use OR with if statements in regards to strings对于字符串,如何将 OR 与 if 语句一起使用
【发布时间】:2020-01-25 23:29:38
【问题描述】:

我想做一个 if 语句来比较两个字符串,看看它们是否匹配。 所以:

if (TypedAnswerOne == CorrectAnswerOne)

如果输入的正确答案与 CorrectAnswerOne 字符串值中的一样,则代码有效。 完全没有问题。

但是...如果输入的答案略有不同,例如一个单词而不是两个单词,则表明答案是错误的。

所以我想知道如何对字符串进行“或”运算?

所以:

 if (TypedAnswerOne == CorrectAnswerOne or "dirtballs" or "Dirt Balls" or "dirt balls") 

如何在 CPP 中用字符串定义“或”?

TY :-)

【问题讨论】:

  • 顺便说一句,C++ 几乎从未被称为“CPP”。您可能会看到 .cpp 用作文件扩展名,但这只是因为在文件名中使用加号会导致问题。
  • 提示:为您的预期匹配创建一个容器(例如std::vector),然后检查您想要的字符串是否在该列表中。如果你只是匹配简单的变体,也许你想要一个更宽松的正则表达式,或者你想清理输入,剥离空格和小写等,以更广泛地匹配。
  • @tadman 如果我们要让 OP 开始使用 STL,那么这种比较最好使用带有不区分大小写哈希函数的 std::unordered_set。
  • @dai C++ 在没有标准库的情况下真的很糟糕,所以学习它是必不可少的。关于std::unordered_set的好推荐。
  • 你应该从一本教你如何使用“if”语句的书中学习 C++

标签: c++ string


【解决方案1】:

当今的许多编程语言(C、C++、Swift、C#、Java、JavaScript、PHP)都共享 C 的花括号语法和运算符语法。

  • 短路逻辑 OR 的语法是双管道:||。
  • 非短路逻辑 OR 的语法是单管道:|(这也用于按位 OR 运算)。
  • 另外,将&& 用于短路逻辑与,& 用于非短路逻辑与或按位与。
  • ^ 是 XOR(而不是幂)。

C++ 与这些其他语言一样,没有内置功能可以让您将单个左侧值与多个右侧值进行比较,因此您需要重复左侧值。

像这样:

if( TypedAnswerOne == "dirtballs" || TypedAnswerOne == "Dirt Balls" || TypedAnswerOne 
 == "dirt balls" )

C and C++ do not support strings in switch statements 不像 Java、C#、Swift 和 PHP,顺便说一句。

顺便说一句,您应该使用不区分大小写的字符串比较,而不是自己定义所有可能的值。

【讨论】:

    【解决方案2】:

    您必须在案例之间定义 OR,而不是在字符串之间。所以,例如:

    if (x == "dirtbag" || x == "dirt bag")
    

    您可以拥有任意数量的 OR,但它开始变得混乱。发生这种情况时,您可能更喜欢开关盒:

    switch(x) {
        case "dirtbag" : ...; // do something
        case "dirt bag" : ...; // do something
    }
    

    如果您愿意使用预先存在的库并且不想处理所有情况(听起来可能有很多!)您总能找到一个适合您的需求并可能处理字符串的库在比较之前(将其设置为小写,删除空格等)。祝你好运!

    【讨论】:

    • C++ 不支持在switch() 语句中使用字符串。只能使用整数值,因为switch 语句通常被编译为原生跳转表。 C# 和 Java 等语言将 string-switch 语句编译为运行时生成的 Map 或 Dictionary 查找。
    • 哦,谢谢!自从我使用 C++ 已经有一段时间了,显然已经忘记了。
    【解决方案3】:

    如果您不关心大小写或多余的空格,那么您希望首先删除所有空格,然后在不区分大小写的基础上比较字符串。

    您可以删除空格,例如this。

    然后不区分大小写的字符串比较像this。

    一般来说,解决编程问题的策略是 google 一下。例如:

      Google: "c++ remove whitespace from string"
      Google: "c++ string compare case insensitive"
    

    【讨论】:

    • 建议人们找到答案的答案并不是真正的答案。
    • “一般来说,解决编程问题的策略是用谷歌搜索。”这是错误的——糟糕的策略
    • 给一个人一条鱼,或者教他如何钓鱼...只是想从长远来看有所帮助(我也确实指出了他的答案)。
    【解决方案4】:

    对于多个可能的值,我倾向于将它们放在一个容器中并使用一种算法:

    #include <algorithm>
    #include <iterator>
    #include <array>
    #include <string>
    #include <iostream>
    
    template <typename T, std::size_t N, typename U>
    bool includes(const std::array<T, N>& arr, const U& value)
    {
        return std::find(std::cbegin(arr), std::cend(arr), value) != std::cend(arr);
    }
    
    struct in_tag {} in;
    template <typename U>
    struct in_op_temporary { const U& value; };
    template <typename U>
    in_op_temporary<U> operator<(const U& lhs, in_tag rhs) { return {lhs}; }
    template <typename U, typename T, std::size_t N>
    bool operator>(in_op_temporary<U> lhs, const std::array<T, N> rhs)
    {
        return includes(rhs, lhs.value);
    }
    
    int main()
    {
        const std::array<std::string, 3> answers {
            "dirtballs", "Dirt Balls", "dirt balls"
        };
    
        if ("Dirt Balls" <in> answers) 
            std::cout << "success!" << std::endl;
        if (not ("DirtBalls" <in> answers)) 
            std::cout << "success!" << std::endl;
    }
    

    Live On Coliru

    但是对于这个特殊问题,我建议找到一种更通用的方法来解释字符串中的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多