C++ 用于检查字符数组是否只包含允许的字符的函数

C++ 用于检查字符数组是否只包含允许的字符的函数,c++,C++,如何更改/删除这个糟糕的if。该函数用于检查字符数组表达式是否只包含从0到9的数字以及if中的符号 bool containsOnlyAllowedSymbols(const char* equation) { bool a; while (*equation) { if ((*equation < 48 || *equation > 57) && *equation != '+' && *equation != '-'

如何更改/删除这个糟糕的if。该函数用于检查字符数组表达式是否只包含从0到9的数字以及if中的符号

bool containsOnlyAllowedSymbols(const char* equation)
{
    bool a;
    while (*equation) {
        if ((*equation < 48 || *equation > 57) && *equation != '+' && *equation != '-' && *equation != '*' && *equation != '/' && *equation != '(' && *equation != ')' && *equation != '[' && *equation != ']' && *equation != '{' && *equation != '}') {
            return false;
        }
        else
            a = true;
        equation++;
    }
    return a;
}

我建议使用std::regex_匹配:

std::regex pattrn("[0-9*/+-]+");
bool only_legal_equation_chars(char const * equation)
{
  return std::regex_match(equation, equation+strlen(equation), pattern);
}
非常适合这里:

std::string mystr{"123+-*["};
auto is_allowed_character = [](unsigned char x) //related to C
                            {
                                return (x >= 48 && x <= 57) ||
                                        x == '+' ||
                                        //so on
                                        ;
                            }
return std::all_of(mystr.begin(), mystr.end(), 
                   is_allowed_character);

我移除if,循环,使它更为地道的C++。同样,它也可以在任何迭代器上运行,即使是由std::cin制成的迭代器。

我很想使用这样好的旧迭代器:

bool containsOnlyAllowedSymbols(const char* equation)
{
    return std::strspn(equation, "0123456789+-*/()[]{}") == std::strlen(equation);
}
另一个正则表达式解决方案:

#include <iostream>
#include <regex>

bool containsOnlyAllowedSymbols(char const *equation)
{
    std::regex re(R"([^0-9(){}[\]*+-/])");
    return !std::regex_search(equation, re);
}

int main()
{

    std::cout << containsOnlyAllowedSymbols("(10+20)-200*4") << std::endl;
    std::cout << containsOnlyAllowedSymbols("10+20-{200}abc") << std::endl;

    return 0;
}

如果表达式可以包含空格,则向正则表达式模式添加空格。

首先,将该表达式移动到函数中,并使用std::isdigit作为数字位。如果函数工作正常,建议使用。在那里的帖子中包含一个测试主节点会很好。这个字符串是从哪里来的?在文本输入时,可以更容易地检查每个字符,而不是所有的一个后备体。它是C++,使用STD::String。注意C++不保证将使用的字符集。可能希望包含所需的头too.fWIW,还有STD::String::FundFixSTyNoTo.Of。同样的想法。@chris,std::all_不应该是短路的,而应该是std::string::find_first_而不是?标准并没有强制要求这样做,但可能任何理智的实现都会这样做。@chris如果它是字符串,我会使用它。不幸的是,更通用的std::find\ux。。。函数不包括…first\u not\u of。@不可数,是的,所有的都是我对如何拼写它的偏好。不确定这两种方法之间的简单性能差异是什么,但这可能并不重要。@chris,我只是想说,标准并不保证在范围的第一个不合适的元素上停止。因此,即使第一个元素已经不适合,它也可能一直运行到结尾。原始字符串文字和利用字符类中失去意义的特殊字符可以使其更容易消化:R[^0-9{}[\]*+-/]。原始文字在这一点上是否有帮助仍有争议。@chris观点很好,如果有什么能让它更可读的话,谢谢!