我如何检查变量是否等于C ++中的多个事物?

时间:2018-08-01 10:57:27

标签: c++ variables operators

我正在编写一段代码,检查用户输入的内容实际上是否是有效输入之一(在这种情况下为1-9),如果不是,则会给出错误消息。

这就是我所拥有的:

if (input != '1', '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '0' )
    {
      cout << "Error";
    }

但是它似乎不起作用。我以为可以用逗号分隔它们,但也许我在想像。

是唯一要做的选择:

input != '1' && input != '2' && input != '3' etc etc

我知道该方法可行,但是似乎有点麻烦。有没有更简单的方法?

5 个答案:

答案 0 :(得分:2)

您可以将值存储在容器中,并使用std::find_ifstd::none_ofstd::any_of函数:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<char> v = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
    char input = '1';
    if (std::none_of(v.cbegin(), v.cend(), [&input](char p){ return p == input; })) {
        std::cout << "None of the elements are equal to input.\n";
    } 
    else {
        std::cout << "Some of the elements are equal to input.\n";
    }
 }

答案 1 :(得分:1)

  

我如何检查变量是否等于多个事物

     

是唯一要做的选择:

input != '1' && input != '2' && input != '3' etc etc

在一般情况下,对于一组任意值:不,不是唯一的选择,但它是最简单的。而且最简单的通常是最好的,或者至少足够好。

如果您不喜欢input !=的重复,可以使用可变参数模板生成表达式。我在另一个问题中写了一个示例:https://stackoverflow.com/a/51497146/2079303

在特定情况下,可能会有更好的选择。例如,示例代码中确实存在std::isdigit

为了检查变量是否(不等于)直到运行时才知道的多重事物,典型的解决方案是使用一组数据结构,例如std::unordered_set

答案 2 :(得分:0)

如果您正在寻找更通用,更易理解的结构,则可以创建如下内容:

template <typename T, int TSize>
struct AnyOfThis {    
    template <typename TFirst, typename... TOthers>
    explicit AnyOfThis(TFirst&& first, TOthers&&... others)
        : values({ std::forward<TFirst>(first), std::forward<TOthers>(others)... }) {}

    std::array<T, TSize> values;
};

template <typename TFirst, typename... TOthers>
auto anyOf(TFirst&& first, TOthers&&... others) {
    constexpr std::size_t size = 1 + sizeof...(others);
    return AnyOfThis<typename std::decay<TFirst>::type, size>(std::forward<TFirst>(first),
                                                              std::forward<TOthers>(others)...);
}

template <typename T, int TSize>
bool operator==(const T value, const AnyOfThis<typename std::decay<T>::type, TSize>& anyOfThis) {
    return std::find(anyOfThis.values.begin(), anyOfThis.values.end(), value) != anyOfThis.values.end();
}

基本上,它从可变参数函数创建一个静态数组。然后还有另一个函数用作比较器,该函数获取要比较的值并在数组中查找该值。

用例的阅读效果也不错:

if (1 == anyOf(1, 2, 3)) {
    // do stuff
}

LIVE DEMO AT COLIRU

答案 3 :(得分:0)

一种简单有效的方法。

std::unordered_set<char> allowedValues = {'1','2','3','4','5','6','7','8','9','0'};
std::unordered_set<char>::const_iterator index = allowedValues.find(input);
if(index == allowedValues.end())
  std::cout << "Error";
else
  std::cout << "Valid";

通过使用无序集,您可以期望O(1)复杂度进行查找。输入数多的时候好。如果您的索引等于集合的结尾,则它在列表中不存在,您将获得集合的结尾作为索引,这对您来说是无效的输入。否则,您会将其视为有效输入

答案 4 :(得分:-1)

如果您要查找“如果字符串不等于 C 中的多个字符串”,则可以使用以下内容(并非所有人会认为它很优雅,但是如果您喜欢旧的c-str,那么您可能会发现它很好。当然,它简单又快速):

int GetIdxOfStringInOptionList (const char *Xi_pStr)
{
    char l_P2[205];
    sprintf(l_P2, "<@%s^>", Xi_pStr);  // TODO: if (strlen>=200) return -1. Note that 200 is above length of options string below
    _strlwr(l_P2);                     // iff you want comparison to be case insensitive
    const char *l_pCO = strstr("01<@gps^>02<@gps2^>03<@log^>04<@img^>05<@nogps^>06<@nogps2^>07<@gps3^>08<@pillars0^>09<@pillars1^>10<@pillars2^>11<@pillars3^>", l_P2);
    return l_pCO? atoi(l_pCO-2) : -1;
}