c++:如何将原始字符串传递给像 evaluate( "2+2+2" )这样的函数?



EDIT::std::string infix="2+2+2";如何将其传递给函数evaluate(std::string s){cout << s}?=>2+2+2?

EDIT2::是一个NULL字符;我的语法检查函数读取字符串中的每个字符,如果它与数字或运算符不同,就会抛出异常。我想读取null字符并抛出异常,但evaluate("2+2+2")返回4


我正在用c++11编写一个简单的计算器,并进行测试,支持中缀表示法。

我有一个函数int evaluate( const std::string & infix ),它根据我的字符串计算结果(即evaluate( "((-3+--4*-(-19+5)))" )返回53)。一切都很好,直到。。。

当我创建一些测试时,我可以编写ASSERT_EQ(6, evaluate("2+2+2"))。但当我写ASSERT_EQ(6, evaluate("2+2+2")时,一切都出错了(这应该抛出一个exception,但它返回4)。

那么,如何将一个字符数组传递到一个函数中,而不知道它的大小,并且里面有空字符呢?当const char cstr[] = "2++2"; evaluate(cstr);未发送完整数组时:(

问题不在函数方面,而在调用者方面。要从包含空字节的字符串文字构造std::string,需要使用一个重载,该重载接收有关字符串大小的信息。

一个这样的过载(这里的数字是4)接收char指针和大小。由于字符串文字是char数组,因此可以使用函数模板检索它们的大小:

template <std::size_t N>
std::string make_string(char const (&lit)[N]) {
    return {lit, N};
}

并如此使用它:

ASSERT_EQ(6, evaluate(make_string("2+2+2")));

您也可以使用相同的原理,通过重载您的函数来直接处理字符串文字:

template <std::size_t N>
auto evaluate(char const (&lit)[N]) {
    return evaluate({lit, N});
}

我的猜测是,您不是在试图测试"2加2 null_byte加2",而是在尝试测试"2+2除以0+2"。

如果是这样,请记住,在C++字符串文字中,您需要键入一个双反斜杠(因为反斜杠被用作许多不可键入字符的转义符)。

尝试

ASSERT_EQ(6, evaluate("2+2\0+2"))

或者,因为您使用的是C++11

ASSERT_EQ(6, evaluate(R"2+2+2"))

使用"原始"字符串文字

当const char cstr[]="2+/0+2"时;evaluate(cstr);不发送完整数组:(

您可以使用std::string的构造函数来接受迭代器范围,例如:

// Using macro
#define ARR_TO_STR(a) std::string(std::cbegin(a), std::cend(a))
// And template function
template <typename T, size_t N>
std::string ArrToStr( T (&t)[N] ) {
    return std::string(std::cbegin(t), std::cend(t));
}
int main()
{
   ASSERT_EQ(6, evaluate(ArrToStr("2++2")))
}

最新更新