例如,我有以下字符串,
if (str[i] == '(' ||
str[i] == ')' ||
str[i] == '+' ||
str[i] == '-' ||
str[i] == '/' ||
str[i] == '*')
我的问题是有一个简洁的方法来说明这个值是否是c ++中这些值集合之一?
答案 0 :(得分:6)
您可以使用特殊字符在字符串中搜索单个字符str[i]
:
std::string("()+-/*").find(str[i]) != std::string::npos
答案 1 :(得分:3)
不光彩,因为它是C而不是C ++,但C标准库总是可以从C ++代码访问,而我作为一个古老的恐龙的第一个想法是:
if (strchr("()+-/*", str[i]) != NULL)
简单紧凑
答案 2 :(得分:2)
您可以使用以下内容:
const char s[] = "()+-/*";
if (std::any_of(std::begin(s), std::end(s), [&](char c){ return c == str[i]})) {
// ...
}
答案 3 :(得分:0)
这实际上取决于你的应用程序。对于如此小的检查并根据上下文,一个可接受的选项可能是使用宏
#include <iostream>
#define IS_DELIMITER(c) ((c == '(') || \
(c == ')') || \
(c == '+') || \
(c == '-') || \
(c == '/') || \
(c == '*') )
int main(void)
{
std::string s("TEST(a*b)");
for(int i = 0; i < s.size(); i ++)
std::cout << "s[" << i << "] = " << s[i] << " => "
<< (IS_DELIMITER(s[i]) ? "Y" : "N") << std::endl;
return 0;
}
更多 C ++ ish 这样做的方法是使用内联函数
inline bool isDelimiter(const char & c)
{
return ((c == '(') || (c == ')') || (c == '+') ||
(c == '-') || (c == '/') || (c == '*') );
}
这篇文章可能很有趣:Inline functions vs Preprocessor macros
答案 4 :(得分:-1)
也许不是“更简洁”,但我认为这种风格在测试时是简洁和表达。
当然,如果您不止一次使用它,is_arithmetic_punctuation
不一定是lambda。它可以是函数或函数对象。
auto is_arithmetic_punctuation = [](char c)
{
switch(c)
{
case '(':
case ')':
case '+':
case '-':
case '/':
case '*':
return true;
default:
return false;
}
};
if (is_arithmetic_punctuation(str[i]))
{
// ...
}