c++:如何将原始字符串传递给类似 evaluate( "2+2\0+2") 的函数?

标签 c++ string templates c++11 null

编辑::std::string infix="2+2\0+2";如何将它传递给函数 evaluate(std::string s){cout << s} ? => 2+2+2 ?

编辑 2::\0NULL特点;我检查语法的函数从字符串中读取每个字符,如果它不同于数字或运算符,它会抛出异常。我想读取空字符并抛出异常,但是 evaluate("2+2\0+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\0+2")一切都出错了(这应该抛出 exception 但它返回 4 )。

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

最佳答案

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

一个这样的重载 ( number 4 here ) 接收 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\0+2")));

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

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

关于c++:如何将原始字符串传递给类似 evaluate( "2+2\0+2") 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449558/

相关文章:

c++ - 字符串到字符串构建函数,为每个字符串使用不同的索引变量

python - 使用 pandas/regex 提取子字符串

c++ - 使用枚举作为模板参数

c++ - 重建仅知道其名称和参数列表的函数的签名

c++ - 调用timer_create()的新线程

c++ - const 变量是否将值存储在变量中?

c++ - C++11 中的 BOOST scoped_lock 替换

python - 在 Python 中查找多个字符串出现

c++ - 动态构建模板参数包

C++:二维数组:一维固定?