我正在编写一段代码,检查用户输入的内容实际上是否是有效输入之一(在这种情况下为1-9),如果不是,则会给出错误消息。
这就是我所拥有的:
if (input != '1', '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '0' )
{
cout << "Error";
}
但是它似乎不起作用。我以为可以用逗号分隔它们,但也许我在想像。
是唯一要做的选择:
input != '1' && input != '2' && input != '3' etc etc
我知道该方法可行,但是似乎有点麻烦。有没有更简单的方法?
答案 0 :(得分:2)
您可以将值存储在容器中,并使用std::find_if,std::none_of或std::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
}
答案 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;
}